Wyklucz katalog w find

11

Jak mogę znaleźć każdy plik i katalog pasujący do wzorca, z wyłączeniem jednego katalogu używającego find?

Powiedzmy, że mam następującą strukturę plików;

.
  foo-exclude-me /
    foo.txt
  foo-exclude-me-not /
    foo.txt
  bar/
    foo.txt
    foobar /
      bar.txt
      foofoo.txt

jak mogę uzyskać następujące dane wyjściowe za pomocą find:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Próbowałem użyć obu poniższych poleceń:

odnaleźć . -nazwa „foo-exclude-me” -prune -o -nazwa „foo *”
odnaleźć . -nazwa „foo *” \! -path './foo-exclude-me/*'

ale obaj zwracają to:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Jak mogę poprawnie wykluczyć foo-exclude-mekatalog?

Tyilo
źródło
Spróbuj użyć foo-exclude-mezamiast ./foo-exclude-me. Spróbuj także dołączyć -printna końcu polecenia.
n0pe
@MaxMackie idealne :)
Tyilo
Naprawił to? Jaka poprawka działała dla Ciebie? Mogę podać odpowiedź zamiast komentarza.
n0pe
@MaxMackie przy użyciu obu -printi foo-exclude-mezamiast ./foo-exclude-me.
Tyilo,
Wspaniale, wygląda na to, że Gilles mnie pobił :)
n0pe

Odpowiedzi:

11
find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print

Jeśli nie -print, domyślna domyślna akcja dotyczy każdego dopasowania, nawet przyciętego. Wyraźne -printstosuje się tylko pod określonymi warunkami, które są -name 'foo*'tylko w gałęzi else w -name 'foo-exclude-me'.

Ogólnie rzecz biorąc, używaj wyrażenia, -printgdy robisz coś bardziej złożonego niż połączenie predykatów.

Druga próba z ! -path './foo-exclude-me/*'nie zadziałała, ponieważ ./foo-exclude-menie pasuje ./foo-exclude-me/*(brak końcowego /). Dodawanie ! -path ./foo-exclude-medziałałoby.

Gilles „SO- przestań być zły”
źródło
-2
-bash-4.1 $ znaleźć. -exec ls -l {} + -name 'a.out' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

-rw-r - r--. 1 oradba dba 499 18 stycznia 19:30 ./a.out
-rw-r - r--. 1 oradba dba 499 18 stycznia 20:59 ./b.out
-rw-r - r--. 1 oradba dba 499 18 stycznia 20:59 ./c.out
-rw-r - r--. 1 oradba dba 499 18 stycznia 20:59 ./d.out

.:
razem 16
-rw-r - r--. 1 oradba dba 499 18 stycznia 19:30 a.out
-rw-r - r--. 1 oradba dba 499 18 stycznia 20:59 p.n.e.
-rw-r - r--. 1 oradba dba 499 18 stycznia 20:59 c.out
-rw-r - r--. 1 oradba dba 499 18 stycznia 20:59 d.out
rm: nie można usunąć `. ': to katalog
ls: nie można uzyskać dostępu do ./b.out: brak takiego pliku lub katalogu
ls: nie można uzyskać dostępu ./d.out: brak takiego pliku lub katalogu
ls: nie można uzyskać dostępu ./c.out: Brak takiego pliku lub katalogu
.:
razem 4
-rw-r - r--. 1 oradba dba 499 18 stycznia 19:30 a.out

użytkownik211226
źródło
Użyłem opcji przycinania, aby pominąć a.out i działa dobrze - art.s
user211226
Absolutnie nie wyjaśniasz, dlaczego -prunejest to istotne. -prunejest jedną z najbardziej skomplikowanych opcji findpowodujących, że powoduje wyłączenie -print(która jest domyślnie włączona)
grochmal
-przycinać Prawda; jeśli plik jest katalogiem, nie schodź do niego. - Więc nie zadziała samo w katalogach jako ochrona. - art.s
user211226