Mam prosty skrypt, który rozumiem większość, jest to polecenie wyszukiwania, które jest niejasne. Mam dużo dokumentacji, ale to nie służy wyjaśnieniu. Myślę, że działa jak pętla for, aktualnie znaleziony plik jest zamieniany na {} i kopiowany do $ HOME / $ dir_name, ale jak wyszukuje -path i -prune -o działa? To „irytujące, że mam taką szczegółową i istotną dokumentację i nadal nie wiem, co się dzieje”.
#!/bin/bash # The files will be search on from the user"s home # directory and can only be backed up to a directory # within $HOME read -p "Which file types do you want to backup " file_suffix read -p "Which directory do you want to backup to " dir_name # The next lines creates the directory if it does not exist test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name # The find command will copy files that match the # search criteria ie .sh . The -path, -prune and -o # options are to exclude the backdirectory from the # backup. find $HOME -path $HOME/$dir_name -prune -o \ -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; exit 0
To jest tylko dokumentacja, o której wiem, że powinienem można to zrozumieć na podstawie.
-ścieżka wzorzec
Nazwa pliku pasuje do wzorca powłoki. Metaznaki nie traktują specjalnie / ani . ; więc na przykład znajdź. -path „./sr*sc” wypisze wpis dla katalogu o nazwie ./src/misc (jeśli taki istnieje). Aby zignorować całe drzewo katalogów, użyj -prune zamiast sprawdzać każdy plik w drzewie. Na przykład, aby pominąć katalog src / emacs i wszystkie znajdujące się w nim pliki i katalogi oraz wypisać nazwy innych znalezionych plików, zrób coś takiego:
find . -path ./src/emacs -prune -o -print
– Akcja: -exec polecenie; Ten niezabezpieczony wariant akcji -execdir jest określony przez POSIX. Główną różnicą jest to, że polecenie jest wykonywane w katalogu, z którego wywołano find , co oznacza, że {} jest rozwijane do względnej ścieżki zaczynającej się od nazwy jednego z początkowe katalogi, a nie tylko podstawowa nazwa dopasowanego pliku.
Podczas gdy niektóre implementacje find zastępują {} tylko tam, gdzie występuje samodzielnie w argumencie GNU find zastępuje {} wszędzie tam, gdzie się pojawia.
I
Na przykład, aby porównać każdy plik nagłówkowy C w bieżącym katalogu lub poniżej z plikiem / tmp / master:
find . -name "*.h" -execdir diff -u "{}" /tmp/master ";"
Komentarze
- Możliwy duplikat find: prune nie ignoruje określonej ścieżki
- Myślę, że jeśli cokolwiek, to ' jest duplikatem wyjaśnienia ścieżki wyszukiwania nawet jeśli odpowiedź w find: prune nie ignoruje określonego p ath ma odpowiedź, która wydaje się pasować do tego pytania. Być może odpowiedzi z wyjaśnienia ścieżki wyszukiwania mają sens dla kogoś bardziej doświadczonego w pisaniu skryptów, ale ' mi nie pomagają. Odpowiedzi tutaj przedstawione mają dla mnie jak dotąd więcej sensu, mimo że ' dopiero zaczynam im zaglądać.
Odpowiedź
-path
działa dokładnie tak samo jak -name
, ale stosuje wzorzec do cała ścieżka do badanego pliku, zamiast do ostatniego komponentu.
-prune
zabrania zejścia poniżej znalezionego pliku, jeśli był to katalog.
Łącząc wszystko razem, polecenie
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
- Rozpoczyna wyszukiwanie plików w
$HOME
. - Jeśli znajdzie plik pasujący do
$HOME/$dir_name
, nie przejdzie „t poniżej niego (” wyczyści „podkatalog). - W przeciwnym razie (
-o
) jeśli znajdzie plik pasujący do*$file_suffix
kopiuje go do$HOME/$dir_name/
.
Wydaje się, że pomysł polega na utworzeniu kopii zapasowej części zawartości $HOME
w podkatalogu tory of $HOME
. Części z -prune
są oczywiście konieczne, aby uniknąć tworzenia kopii zapasowych …
Komentarze
- Jeśli to rozumiem: find będzie iterował przez każdy katalog w $ HOME, do którego ma uprawnienia dostępu, z wyjątkiem $ HOME / $ dir_name, do którego nie zejdzie (ponieważ akcja prune zwróci wartość true i lub nie zostanie podjęta), wyszukując pliki kończące się na $ file_suffix. Następnie, gdy tylko znajdzie jeden, wykona cp ” found_file.sh ” do $ HOME / $ dir_name? Ponadto -path pozwala na ścieżkę do pliku i jest przydatne, gdy chcesz znaleźć zejście do katalogów, a nie tylko pracować w bieżącym katalogu?
- Rozumiesz prawie poprawny.
-path
działa tak samo jak-name
: wybiera pliki. Różnica polega na tym, że-name
dopasowuje wzorzec do nazwy pliku, podczas gdy-path
dopasowuje wzorzec do pełnej nazwy ścieżki.find
zawsze schodzi do podkatalogów, chyba że jest to zabronione przez-maxdepth
lub-prune
itd. - Och!-path jest stosowany do $ HOME / $ dir_name -prune, więc ' to kolejność poleceń, która mnie denerwowała, a -path jest konieczne dla polecenia prune, ponieważ musi pasować do pełnej ścieżki oczyszczonego katalogu.
- @Darren I ' Nie jestem pewien, czy to ' jest dość dokładne.
-path $HOME/$dir_name
to jedno działanie. Jest to test, który sprawdza, czy ścieżka aktualnie sprawdzanego pliku jest zgodna z tym, co$HOME/$dir_name
jest.-prune
to osobna czynność. Myślę, że pierwsze zdanie Twojego pierwszego komentarza dokładnie oddaje sposób, w jaki to działa. - Czy byłoby coś, czego brakowałoby, gdyby był to fajka? Zamieniłem -prune na -print i myślę, że teraz przepływ jest jasny: znajdź $ HOME | -ścieżka $ HOME / $ nazwa_katalogu | -print
Odpowiedź
Jest to część polecenia find, instrukcja -exec.
Pozwala na interakcję z plikiem / katalogiem znalezionym przez polecenie find
.
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
find $HOME
oznacza znajdowanie plików / katalogów w $ HOME
Aby zrozumieć -path <some_path>
, zobacz wyjaśnienie „ find -path„
Aby zrozumieć -prune
, zobacz https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh
-o
oznacza OR, więc -path <some_path>
LUB -name *$file_suffix
-exec
oznacza wykonanie polecenia.
cp {} $HOME/$dir_name/
skopiuj wszystkie pliki pasujące do $HOME/$dir_name/
\;
oznacza zakończ polecenie -exec