Kiedy używam
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
znajdzie wszystkie typy plików. Ale kiedy dodam -exec
na końcu:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} \;
wygląda na to, że drukuje tylko .txt
pliki. Co ja robię źle?
Uwaga: za pomocą MINGW (Git Bash)
*.js*
lub*.txt
.Odpowiedzi:
jest skrótem od:
Oznacza to, że ponieważ nie określono predykatu akcji (tylko warunki ),
-print
akcja jest domyślnie dodawana dla plików spełniających warunki.(a przy okazji, wydrukowałoby to
.js
pliki nieregularne (-type f
dotyczy to tylko.htm
plików)).Podczas:
jest skrótem od:
Dla
find
(jak w wielu językach) AND (-a
; domyślny, gdy pominięty) ma pierwszeństwo przed OR (-o
), a dodanie jawnego predykatu akcji (tutaj-exec
) anuluje-print
niejawną akcję widoczną powyżej. Tutaj chcesz:Lub:
Aby uniknąć uruchamiania jednego
sh
pliku na plik.źródło
To implikowane nawiasy klamrowe. Dodaj wyraźne nawiasy klamrowe.
\(
\)
lub używając xargs (lubię xargs, uważam, że jest to łatwiejsze, ale najwyraźniej nie tak przenośne).
źródło