Przenieś grupę plików, monitując użytkownika o potwierdzenie każdego pliku

9

System: Ubuntu MATE 18.04.

Mam kolekcję plików (w wielu katalogach w strukturze katalogów) i chcę przenieść wiele z nich do innego katalogu. Potrafię powiedzieć, które pliki chcę przenieść według ich nazw (są to tytuły receptur), ale nie ma innego sposobu na odróżnienie plików, które chcę przenieść od plików, których nie chcę przenosić; Muszę podjąć decyzję w sprawie każdego pliku, samodzielnie sprawdzając jego nazwę.

Tak więc uruchamiam polecenie raz dla każdego pliku, który chcę przenieść

mv Snacks/OkaraCrackers NeedsTesting/
mv Snacks/SunflowerBrittle NeedsTesting/
mv Treats/ChocolateChilliFudge NeedsTesting/
mv Treats/PecanBlondies NeedsTesting/

Nawet przy uzupełnianiu tabulatorów to zbyt dużo pisania. Naprawdę chcę coś takiego

shopt -s globstar
mv --prompt-me-for-every-file ** NeedsTesting/

Więc mogę po prostu nacisnąć ylub ndla każdego pliku.

Jak mogę przenieść grupę plików i wyświetlać monit o potwierdzenie każdego pliku?

Zanna
źródło

Odpowiedzi:

6

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:

wiele plików wybranych w strukturze drzewa w przeglądarce plików Caja, przeciąganych do innego folderu, ale jeszcze nie przeniesionych

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.

sytuacja po zakończeniu przeciągania, w której wybrane pliki znajdują się teraz razem w folderze docelowym zamiast w oryginalnych oddzielnych lokalizacjach

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 tarbez problemu wykonać dodatkową kopię zapasową . Sugeruję zrobienie tego niezależnie od używanej metody.

Sposób 2 : findPolecenie z -okakcją

Powszechnie używa się finddo znajdowania plików i przekazywania ich ścieżek do dowolnego zewnętrznego polecenia zawierającego akcje -execi -execdir. Ale findma -oki -okdirto 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ń Textsna katalog źródłowy (który może być tylko, .jeśli chcesz cd) i Glorious Destination Folderna rzeczywisty katalog docelowy.

To uruchamia jedno polecenie na plik; w przeciwieństwie do -execi -execdir, -oki -okdirnie obsługują +zamiast \;przejść wielu znalezionych ścieżek w tym samym wywołaniu polecenia. W związku z tym nie musisz używać -t destformularza mv. Proponuję robić tak i tak, choć zarówno w ogólności z finda szczególnie w tej sytuacji tak, że wyglądają bardziej jak monity poleceń oni monitowania o.

Gdy to polecenie jest napisane, jeśli findnapotka 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 fzamiast niego -xtype f.

Możesz to zrobić podczas scriptsesji, 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 findpolecenia, 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 manifestdowolną nazwę dla pliku, który zawiera listę rozważanych plików (i odpowiednio dostosuj pozostałe kierunki).

Jak wyżej, zamień Textsna rzeczywisty katalog źródłowy, co może być, .gdybyś cddo niego podszedł. Jeśli jednak Textsjest 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 findpolecenia otwórz manifestw 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 grepi xargsprzesł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 Folderna nazwę rzeczywistego miejsca docelowego. Otóż ​​to; twoje pliki zostały przeniesione. Możesz oczywiście napisać echowcześniej, mvaby zobaczyć polecenia, które zostaną uruchomione jako pierwsze, jeśli chcesz.

Sposób działania polecenia jest następujący:

  1. W greplinii poleceń z wyjściami manifestże nie ( -v) start ( ^) z opcjonalnym ( *) (spacji \s), a następnie dosłownym #charakterem. -PFlag wybrać PCRE jako dialekt wyrażenia regularne (co umożliwia \sktóry uważam za bardziej czytelne niż tradycyjna [[:space:]]).
  2. xargsPolecenie 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.
Eliah Kagan
źródło
1
-okIMHO najlepsza odpowiedź
pim
7

Oto mały skrypt ( mv-confirm.sh):

#!/bin/bash

# Just make sure there are at least one source and one destination
if [ "$#" -lt 2 ]; then
    echo "Illegal number of parameters"
fi

DESTINATION=${*:$#}             # last argument
SOURCES=( ${@:1:$#-1} )         # all but last arguments

for i in "${SOURCES[@]}"
do
    read -p "move '$i' to '$DESTINATION' ? [y/n] " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]
    then
        echo mv "$i" "$DESTINATION"
    fi
done

Przykładowe użycie:

./mv-confirm.sh ** somewhere
move 'a' to 'somewhere' ? [y/n] n
move 'b' to 'somewhere' ? [y/n] y
mv b d
...

nie zapomnij, aby skrypt był wykonywalny ( chmod +x mv-confirm.sh).

NB

Ponieważ nie chcę zadzierać z twoimi plikami, dodałem echoprzed właściwym mv poleceniem. Możesz go usunąć, aby przenieść pliki.

pim
źródło