Команда Linux: найдите файлы и запустите на них команду

16

Как мне найти все файлы в каталоге и подкаталогах и запустить команду для них?

Например,

find . -type f -name "*.txt" 

находит все текстовые файлы и:

find . -type f -name "*.txt" | gedit

отправляет его в gedit, но внутри текстового файла. Я хочу, чтобы gedit открыл все текстовые файлы.

хуг
источник

Ответы:

22

Вы можете использовать -execфлаг, чтобы выполнить команду для каждого соответствующего файла:

$ find ./ -type f -name "*.txt" -exec gedit "{}" \;

Синтаксис

Синтаксис немного странный (более подробно см. -exec command ;В manpages):

The string `{}' is replaced by the current file name being processed

Вы также можете подумать -execdir, что будет делать то же самое, но выполняет команду из подкаталога, содержащего соответствующий файл (это обычно предпочтительнее).

Дэвид Кейн
источник
1
Спасибо. Я вижу, что это работает. Но что означает конец ("{}" \ :)? выполнить список?
1
{}Стоит имя текущего файла, а точка с запятой просто завершения команды. Обратная косая черта и окружающие кавычки предназначены только для предотвращения расширения оболочки.
Дэвид Кейн
5

find . -type f -name "*.txt" -print0 | xargs -0 gedit

Notinlist
источник
Спасибо. Я вижу, что это работает. Но что значит -print0 | xargs -0 часть означает?
1
@xyz, вы можете прочитать о флагах любой команды UNIX, используя страницы руководства. Попробуйте man findили man xargs, затем, /чтобы найти данный флаг. Документация довольно хорошая, она должна отвечать на ваши вопросы.
Дэвид Кейн
1
-print0печатает символ NULL после каждой записи, -0ожидает , что записи разделяются символом NULL. Это самый безопасный способ обработки хитрых имен.
Notinlist
И не странно ли, что синтаксис не gedit xargs -0 вместо xargs -0 gedit. Я вижу, что первый не работает, но не понимаю, почему.
3
xargs предпочтительнее -exec из соображений производительности, поскольку xargs может «собрать» несколько аргументов перед передачей их в gedit. Если нужно запустить gedit для каждого файла отдельно, замените '... -print0 | xargs -0 gedit 'with' ... -print0 | xargs -0 -i gedit {} 'xargs - это одна из тех команд, таких как find и screen, с которой вы никогда не узнаете, как вы обходились без года после того, как узнали об этом.
arclight