Чаще всего я использую технику find | xargs. Например, если вы хотите сделать каждый файл в этом каталоге и все его подкаталоги общедоступными, вы можете сделать следующее:
find . -type f -print0 | xargs -0 chmod go+r
find . -type d -print0 | xargs -0 chmod go+rx
-print0Вариант заканчивается нулевым символом , а не пространства. -0Вариант разделяет его вход таким же образом. Так что это комбинация для использования с файлами с пробелами.
Вы можете изобразить эту цепочку команд как вывод каждой строки, findвставив ее в конец chmodкоманды.
Если команда, которую вы хотите запустить в качестве аргумента в середине, а не в конце, вы должны быть немного креативными. Например, мне нужно было перейти в каждый подкаталог и запустить команду latemk -c. Поэтому я использовал (из Википедии ):
find . -type d -depth 1 -print0 | \
xargs -0 sh -c 'for dir; do pushd "$dir" && latexmk -c && popd; done' fnord
Это имеет эффект for dir $(subdirs); do stuff; done, но безопасно для каталогов с пробелами в их именах. Кроме того, отдельные вызовы stuffвыполняются в одной и той же оболочке, поэтому в моей команде мы должны вернуться в текущий каталог с помощью popd.