Команда 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


Спасибо. Я вижу, что это работает. Но что значит -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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.