Sposób 1: W graficznej przeglądarce plików za pomocą widoku drzewa
Zakładam, że twoim prawdziwym celem jest dokonanie wyboru dla każdego pliku, a nie ściśle monitowanie . Jeśli jednak wolisz otrzymywać monity o każdy plik w terminalu, zobacz sposób 2 poniżej.
Większość graficznych przeglądarek plików obsługuje widok drzewa, w którym można przeglądać wiele poziomów hierarchii katalogów jednocześnie. Możesz kopiować lub przenosić pliki z tego widoku, albo indywidualnie, albo wybierając je, a następnie operując na całym zaznaczeniu. Działa to nawet z plikami z wielu folderów.
W niektórych przeglądarkach plików należy przejść do menu Preferencje, aby włączyć widok drzewa. W Caja, przeglądarce plików MATE, jest ona zawsze włączona w widoku listy. Kliknij Widok → Lista (lub naciśnij Ctrl+ 2), aby przejść do widoku listy. Każdy katalog ma po lewej stronie mały trójkąt skierowany w prawo, co oznacza, że można go rozwinąć. Aby rozwinąć folder, kliknij ten trójkąt lub naciśnij klawisz →(strzałka w prawo) po wybraniu folderu. W tym przykładzie wybrałem je wszystkie po kolei i przeciągam je wszystkie jednocześnie:
Zakładając, że źródło i miejsce docelowe znajdują się na tym samym dysku, domyślnie przeciąganie ruchów. Jeśli zamiast tego chcesz skopiować, przytrzymaj Ctrlklawisz.
Teoretycznie przy użyciu tej metody łatwo jest naprawić błędy, ponieważ większość przeglądarek plików (w tym Caja) obsługuje Ctrl+ Zcofanie ostatnich działań, w tym działań wsadowych. Jednak miałem z tym mieszane szczęście. Czasami pliki wracają do niewłaściwego folderu.
Dobrą wiadomością jest to, że wydaje się, że pracujesz głównie z dokumentami tekstowymi, które zwykle są małe, więc możesz tar
bez problemu wykonać dodatkową kopię zapasową . Sugeruję zrobienie tego niezależnie od używanej metody.
Sposób 2 : find
Polecenie z -ok
akcją
Powszechnie używa się find
do znajdowania plików i przekazywania ich ścieżek do dowolnego zewnętrznego polecenia zawierającego akcje -exec
i -execdir
. Ale find
ma -ok
i -okdir
to monit przed każdym uruchomieniem polecenia. Jeśli naprawdę chcesz, aby terminal wyświetlał monit o każdy plik, myślę, że tak właśnie należy.
Po zakończeniu tworzenia takich samych efektów, jak pokazano powyżej, wygląda to tak:
ek@Gnar:~$ find Texts -xtype f -ok mv -t 'Glorious Destination Folder' {} \;
< mv ... Texts/Robert Frost/New Hampshire.pdf > ? y
< mv ... Texts/Robert Frost/In The Clearing.pdf > ? n
< mv ... Texts/Helen Keller/The Story of My Life.pdf > ? y
< mv ... Texts/Saki/The Short Stories of Saki.pdf > ? y
< mv ... Texts/Jane Austen/Sense and Sensibility.pdf > ? n
< mv ... Texts/Jane Austen/Pride and Prejudice.pdf > ? y
< mv ... Texts/Richard Connell/The Stolen Crime.pdf > ? n
< mv ... Texts/Richard Connell/The Most Dangerous Game.txt > ? y
< mv ... Texts/Mary Wollstonecraft Shelley/Mathilda.epub > ? n
< mv ... Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf > ? y
< mv ... Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf > ? n
< mv ... Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm > ? y
Zamień Texts
na katalog źródłowy (który może być tylko, .
jeśli chcesz cd
) i Glorious Destination Folder
na rzeczywisty katalog docelowy.
To uruchamia jedno polecenie na plik; w przeciwieństwie do -exec
i -execdir
, -ok
i -okdir
nie obsługują +
zamiast \;
przejść wielu znalezionych ścieżek w tym samym wywołaniu polecenia. W związku z tym nie musisz używać -t dest
formularza mv
. Proponuję robić tak i tak, choć zarówno w ogólności z find
a szczególnie w tej sytuacji tak, że wyglądają bardziej jak monity poleceń oni monitowania o.
Gdy to polecenie jest napisane, jeśli find
napotka dowiązanie symboliczne, które ostatecznie wskazuje na zwykły plik, zostanie ono (a nie cel) przeniesione, a nie zignorowane. Jeśli naprawdę chcesz obsługiwać tylko jeden zwykły plik, użyj -type f
zamiast niego -xtype f
.
Możesz to zrobić podczas script
sesji, aby dowiedzieć się, co się stało, jeśli popełnisz błąd. Ale znowu, nie ma powodu, aby nie mieć kopii zapasowej.
Sposób 3: Wygeneruj manifest i edytuj go
Przynajmniej tak długo, jak długo w nazwach plików nie ma znaków nowej linii, możesz zacząć od użycia prostego find
polecenia, aby wygenerować manifest - plik zawierający listę nazw plików, które (w tym przypadku potencjalnie) są zainteresowane) :
find Texts -xtype f >manifest
Zamień na manifest
dowolną nazwę dla pliku, który zawiera listę rozważanych plików (i odpowiednio dostosuj pozostałe kierunki).
Jak wyżej, zamień Texts
na rzeczywisty katalog źródłowy, co może być, .
gdybyś cd
do niego podszedł. Jeśli jednak Texts
jest to ścieżka względna (w tym jeśli to jest .
), powinieneś upewnić się, że będziesz w tym samym miejscu później, kiedy faktycznie wykonasz ruchy.
Po uruchomieniu tego find
polecenia otwórz manifest
w edytorze tekstu. To może być nano
, vim
, emacs
, gedit
, pluma
, itd. W edytorze komentarz na liniach że nazwa pliki, które nie chcą przejść przez umieszczenie #
na początku nich. Niektórzy redaktorzy podświetlą te wiersze inaczej, nawet jeśli nie rozpoznaje pliku w jakimkolwiek formacie, o którym wie, że ma komentarze. Większość jednak tego nie zrobi, a prawdziwym powodem, dla którego sugeruję zrobić to w ten sposób, jest to, że jako człowiek prawdopodobnie doświadczasz komentowania wierszy w plikach konfiguracyjnych (i być może w kodzie źródłowym). Myślę, że jest to bardziej intuicyjne i mniej podatne na błędy, niż oznaczanie linii, które chcesz przenieść.
Oczywiście możesz zamiast tego po prostu usunąć wiersze dla plików, których nie chcesz przenieść. Zaletą ich komentowania jest to, że później będzie jasne, co zrobiłeś.
W moim przykładzie tak wyglądała zawartość pliku po jego edycji:
Texts/Robert Frost/New Hampshire.pdf
# Texts/Robert Frost/In The Clearing.pdf
Texts/Helen Keller/The Story of My Life.pdf
Texts/Saki/The Short Stories of Saki.pdf
# Texts/Jane Austen/Sense and Sensibility.pdf
Texts/Jane Austen/Pride and Prejudice.pdf
# Texts/Richard Connell/The Stolen Crime.pdf
Texts/Richard Connell/The Most Dangerous Game.txt
# Texts/Mary Wollstonecraft Shelley/Mathilda.epub
Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf
# Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf
Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm
Następnie możesz odfiltrować skomentowane linie grep
i xargs
przesłać wyniki, aby przekazać je do mv
:
grep -Pv '^\s*#' manifest | xargs -d '\n' mv -t 'Glorious Destination Folder'
Jak wyżej, zamień Glorious Destination Folder
na nazwę rzeczywistego miejsca docelowego. Otóż to; twoje pliki zostały przeniesione. Możesz oczywiście napisać echo
wcześniej, mv
aby zobaczyć polecenia, które zostaną uruchomione jako pierwsze, jeśli chcesz.
Sposób działania polecenia jest następujący:
- W
grep
linii poleceń z wyjściami manifest
że nie ( -v
) start ( ^
) z opcjonalnym ( *
) (spacji \s
), a następnie dosłownym #
charakterem. -P
Flag wybrać PCRE jako dialekt wyrażenia regularne (co umożliwia \s
który uważam za bardziej czytelne niż tradycyjna [[:space:]]
).
xargs
Polecenie dzieli sygnał wejściowy, który jest (wyjście grep
) do nowej linii pola zakończone ( -d '\n'
), a następnie wkleja każde pole (bez nowej linii obciążeniowym) jako oddzielnego parametru w celu polecenia mv -t 'Glorious Destination Folder'
, które działa.
-ok
IMHO najlepsza odpowiedź