Как я могу запустить определенную команду для каждого результата поиска?

Как запустить конкретную команду для каждого файла, найденного с помощью команды find ? Для целей вопроса можно сказать, что я просто хотел бы удалить каждый файл, найденный find .

Я unix / linux noob, будьте осторожны со мной.

  • Как найти файл в каталоге
  • Печать уникальных строк
  • Подтвердите команду «svn ci» в зависимости от моего текущего местоположения
  • FTP: определение суммарного количества файлов на диске перед началом передачи
  • Отправка файла в виде электронного письма
  • Как найти команду, если я не знаю ее имени?
  • Как сравнить строки в двух файлах
  • Как заключить в кавычки, если как одиночные, так и двойные кавычки уже используются?
  • Что означает newermt в команде find?
  • Укажите тип MIME для команды lpr CUPS
  • Как я могу создать «режим киоска CLI» при запуске системы?
  • Как искать файлы по размеру и расширению?
  • 4 Solutions collect form web for “Как я могу запустить определенную команду для каждого результата поиска?”

    Изменить. Хотя следующий ответ объясняет общий пример использования, я должен отметить, что удаление файлов и каталогов – это особый случай. Вместо использования -execdir rm {} \; создайте, просто используйте -delete , как в:

     find -iname '*.txt' -delete 

    Это обрабатывает кучу крайних случаев, о которых вы, возможно, и не подумали бы, о том, какие файлы заказов и каталоги нужно удалить, чтобы они не попадали в ошибки. Для других случаев использования …

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

    За параметрами -exec следует команда, которую вы хотите запустить с {} обозначающей точку, в которой файл, найденный с помощью find, должен быть включен и завершен либо \; для запуска команды один раз для каждого файла или + для замены {} список аргументов всех совпадений. Обратите внимание, что терминатор с точкой с запятой экранирован, так что оболочка не понимает разделитель, ведущий к новой команде.

    Допустим, вы нашли все текстовые файлы:

     find -iname '*.txt' -execdir rm {} \; 

    Вот соответствующий бит из руководства по поиску ( man find ):

      -exec command ; Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of ';' is encountered. The string '{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a '\') or quoted to protect them from expansion by the shell. See the EXAMPLES sec- tion for examples of the use of the -exec option. The specified command is run once for each matched file. The command is exe- cuted in the starting directory. There are unavoidable secu- rity problems surrounding use of the -exec action; you should use the -execdir option instead. -exec command {} + This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the total number of invoca- tions of the command will be much less than the number of matched files. The command line is built in much the same way that xargs builds its command lines. Only one instance of '{}' is allowed within the command. The command is executed in the starting directory. -execdir command ; -execdir command {} + Like -exec, but the specified command is run from the subdirec- tory containing the matched file, which is not normally the directory in which you started find. This a much more secure method for invoking commands, as it avoids race conditions dur- ing resolution of the paths to the matched files. As with the -exec action, the '+' form of -execdir will build a command line to process more than one matched file, but any given invocation of command will only list files that exist in the same subdirec- tory. If you use this option, you must ensure that your $PATH environment variable does not reference '.'; otherwise, an attacker can run any commands they like by leaving an appropri- ately-named file in a directory in which you will run -execdir. The same applies to having entries in $PATH which are empty or which are not absolute directory names. 

    Альтернативой является передача вывода и его анализ с помощью последующих команд. Единственный безопасный способ сделать это – использовать параметр -print0 , который говорит find использовать нулевой символ в качестве разделителя результатов. Принимающие команды должны иметь возможность распознавать ввод с нулевым ограничением. Пример:

     find /home/phunehehe -iregex '.*\.png$' -print0 | xargs -0 file 

    Обратите внимание, что параметр -0 указывает xargs обрабатывать ввод как нулевой.

    Поиск имеет встроенную команду delete, если это все, что вам нужно сделать.

    find . -name "*.txt" -delete

    Любой найденный файл .txt будет удален с помощью команды выше.

    Вы можете выполнить это, используя команду xargs . xargs запускает команду один раз для каждой инструкции своего стандартного ввода. Итак, если вам нужно удалить все файлы .jpg в каталоге, например, быстрый путь в командной строке:

     $ find ./ -name "*.jpg" | xargs rm 

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

     $ rm `find ./ -name "*.jpg"` 

    Обратите внимание, что из-за того, как xargs и оболочки обрабатывают свой вход, метод xargs работает только в том случае, если ни одно из имен файлов и имен каталогов не содержит пробелов или любого из \"' ; метод backquote работает только в том случае, если ни одно из имен файлов и каталогов имена включают пробел или любой из \[?* .

    Linux и Unix - лучшая ОС в мире.