Używam find
do lokalizowania i usuwania plików kopii zapasowych, ale chcę wykluczyć niektóre katalogi z wyszukiwania. Nazwy plików kopii zapasowych mógł zakończyć w .bck
, bak
, ~
, lub backup
.
Kod minimalnego przykładu roboczego (MWE) z tylko trzema katalogami do wykluczenia to:
#! /bin/bash
find . -type d \( -path "./.*" -o -path "./Music" -o -path "./Documents" \) -prune -o -type f \( -name "*.bck" -o -name "*.bak" -o -name "*~" -o -name "*.backup" \) -print0 | xargs -0 --no-run-if-empty trash-put
Składnia \( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
wydaje się trochę niezgrabna, szczególnie jeśli jest około dziesięciu katalogów do wykluczenia, chociaż pokazałem tylko trzy w MWE.
Czy istnieje bardziej elegancki sposób korzystania z pliku wejściowego z listą wykluczonych katalogów lub z konstrukcją podobną do tablicy lub listy, którą można wprowadzić do usługi?
Przykro mi, że nie wyraziłem się jasno, kiedy napisałem swoje oryginalne pytanie.
NB: trash-put
to narzędzie, które przenosi pliki Trashcan
zamiast je usuwać [1].
Dzięki GNU find (tj. Pod niewbudowanym Linuksem lub Cygwinem) możesz użyć,
-regex
aby połączyć wszystkie te-path
symbole wieloznaczne w jeden regex.W FreeBSD lub OSX użyj
-E
zamiast-regextype posix-extended
.źródło
Grupuj
-path ... -prune
w jedno wyrażenie zamknięte za\( ... \)
pomocą logiki-o
( lub ).Przykład nie będzie iteracyjne katalogów lub plików na lub poniżej
/somepath/a
,/somepath/b
oraz/somepath/c
.Oto bardziej konkretny przykład z użyciem wielu akcji.
źródło
Wydaje się, że jest to raczej pytanie podstawowe niż
find
pytanie. Z plikiem zawierającym( -name dir1 -o -name dir2 ) -prune
(bez „\”!) Możesz po prostu to zrobić:Bez zmiany samego wywołania find (do
eval find
lub przez zmianę $ IFS) działa to jednak tylko ze ścieżkami bez białych znaków.Jeśli chcesz uprościć plik, możesz napisać skrypt.
I użyć
zamiast.
źródło
-name
przezpath
).\( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
wykluczenie niektórych katalogów z wyszukiwania rekurencyjnegofind
. Nie szukam niczego w plikach, ale raczej usuwam określone pliki i unikam pewnych katalogów na ścieżce wyszukiwania. Nie rozumiem też, co twój skrypt próbuje zrobić. Wygląda na to, że mamy nieporozumienia. Przepraszam. Zostawmy to w tym miejscu.