Mam duży folder zdjęć (tysiące) i mam długą listę plików, według dokładnej nazwy pliku, które muszę skopiować do innego folderu. Chcę wiedzieć, czy istnieje sposób na wybranie kilku konkretnych plików z tego folderu według nazwy i skopiowanie ich do innego folderu za pomocą terminala bez kopiowania ich osobno?
command-line
files
Ktoś ze zdecydowanie zbyt wieloma piktami
źródło
źródło
cp -rp /copying/from/{folder1/,folder2/,folder3/} path/to/folder
gdziep
jest do kopiowania uprawnień do folderu.Odpowiedzi:
Wystarczy skopiować wiele plików jednocześnie z wiersza polecenia
Można to osiągnąć na kilka sposobów. Najłatwiejsze, jakie widziałem, to skorzystanie z poniższych.
Składnia używa polecenia cp, a następnie ścieżki do katalogu, w którym znajdują się żądane pliki, a wszystkie pliki, które chcesz skopiować, są owinięte w nawiasy i oddzielone przecinkami.
Pamiętaj, że między plikami nie ma spacji. Ostatnia część polecenia,
/home/usr/destination/
to katalog, do którego chcesz skopiować pliki.lub jeśli wszystkie pliki mają ten sam prefiks, ale różne zakończenia, możesz zrobić coś takiego:
Gdzie plik 1, plik 2, plik 3 i plik 4 zostaną skopiowane.
Z tego, jak sformułowałeś pytanie, uważam, że tego właśnie szukasz, ale brzmi to również tak, jakbyś szukał polecenia do odczytania z listy plików i skopiowania ich wszystkich do określonego katalogu. W takim przypadku daj mi znać, a ja zmienię odpowiedź.
Radzenie sobie z duplikatami za pomocą Pythona
Napisałem więc mały skrypt Pythona, który moim zdaniem powinien wykonać zadanie. Nie jestem jednak pewien, jak dobrze znasz język Python (jeśli w ogóle), więc postaram się wyjaśnić, jak najlepiej korzystać z tego skryptu i zadaj tyle pytań, ile potrzebujesz.
Ten skrypt powinien być stosunkowo prosty w użyciu. Najpierw skopiuj powyższy kod do programu gedit (powinien być preinstalowany w Ubuntu) lub w dowolnym innym edytorze tekstu.
Po zakończeniu zapisz plik jako move.py w swoim katalogu domowym (może to być dowolny katalog, ale dla ułatwienia instrukcji, po prostu skorzystaj z katalogu domowego) lub dodaj katalog, w którym znajduje się plik do ŚCIEŻKI. Następnie
cd
przejdź do katalogu domowego (lub innego katalogu, w którym zapisałeś move.py in) z terminala i wpisz następującą komendę:Powinno to skopiować wszystkie pliki z katalogu źródłowego do katalogu docelowego z duplikatami w formacie pic (1) .jpg, pic (2) .jpg i tak dalej. plik.txt powinien być plikiem, który zawiera listę wszystkich zdjęć, które chcesz skopiować, z każdym wpisem w osobnym wierszu.
Skrypt ten w żaden sposób nie powinien wpływać na katalog źródłowy, jednak po prostu upewnij się, że wprowadzasz prawidłowe ścieżki do katalogu źródłowego i docelowego, a najgorsze, co może się zdarzyć, to skopiowanie plików do niewłaściwego katalogu.
Notatki
„plik nie istnieje” i wyświetli monit o naciśnięcie „enter”, aby kontynuować, a skrypt będzie kontynuował kopiowanie reszty listy.
/
ścieżce zarówno dokatalogu źródłowego, jak i ścieżki do katalogu docelowego. W przeciwnym razie skrypt wypluje ci błąd.
źródło
cp $(pwd)/{file1,file2} /path/to/dst/
Lubcp $(pwd)/{file1,file2} $(pwd)/{renamed1,renamed2}
, itd.Być może brakuje mi szczegółów twojego pytania, ale udzielone odpowiedzi wydają się przesadne. Jeśli chcesz rozwiązania wiersza polecenia, a nie skryptu, dlaczego nie:
Zaletą robienia tego w ten sposób jest to, że możesz uzupełniać nazwy plików tabulatorami
źródło
brew install coreutils
wtedy możesz dostać zwykłe rzeczy GNU zg
prefiksem. Tak to będziegcp -t ....
cp
, aw szczególności ani OpenBSD, ani FreeBSD nie mają tej opcji, więc tak - jest tocp
specyficzne dla GNU . Nie jest to również określone przez standard POSIX . Ponieważ jest to strona specyficzna dla Ubuntu, jest to dopuszczalne, ale do przenoszenia skryptów między systemami operacyjnymi lepiej jest trzymać się standardu POSIXOto czyste rozwiązanie bash. Odczyta nazwy plików z pliku wejściowego (jeden na linię) i skopiuje każdy z nich, zmieniając nazwę duplikatów.
Zapisz ten skrypt w folderze w swoim
$PATH
i wywołaj go z listą ścieżek jako danych wejściowych:Możesz również uruchomić całą rzecz jako polecenie z terminala:
źródło
Zgodnie z opisem pytania rozumiem, że:
input.txt
W związku z tym można użyć następującego polecenia:
Wyjaśnienie:
-I %
określa symbol aktualnie przetwarzanego pliku do użycia w poleceniu--arg-file=input.txt
określa pobieranie argumentów z poleceniainput.txt
cp /path/to/origin_dir/% /path/to/destination/
wykonacp
polecenie z/path/to/origin_dir/%
zamienionym na/path/to/origin_dir/
i nazwa aktualnie przetwarzanego pliku.Praktyczny przykład:
źródło