Дополнительно
Выполнение команды для всех файлов в каталоге
Не мог бы кто-нибудь предоставить код, чтобы сделать следующее: Предположим, есть каталог файлов, каждый из которых нужно прогнать через программу. Программа выводит результаты в стандартный вывод. Мне нужен сценарий, который войдет в каталог, выполнит команду для каждого файла и объединит результаты в один большой выходной файл.
Например, чтобы выполнить команду для 1 файла:
$ cmd [option] [filename] > results.out
254
9
Следующий код bash передаст команде $file, где $file будет представлять каждый файл в /dir
Пример
Как насчет этого:
-maxdepth 1
предотвращает рекурсивный спуск find в любые вложенные каталоги. (Если вы хотите, чтобы такие вложенные каталоги обрабатывались, этот аргумент можно опустить).-type -f
указывает, что будут обрабатываться только простые файлы.-exec cmd option {}
указывает запуститьcmd
с указаннойoption
для каждого найденного файла, при этом имя файла заменяется на{}
.\;
обозначает конец команды.cmd
перенаправляется в файлresults.out
Однако, если вам важен порядок обработки файлов, лучше написать цикл. лучше написать цикл. Я думаю, что
find
обрабатывает файлы в порядке следования (хотя я могу ошибаться в этом), что может быть не тем, что что может быть не тем, что вам нужно.Я'м делаешь это на мой Raspberry Pi из командной строки с помощью команды:
Мне нужно скопировать все .MD файлы из одного каталога в другой, так вот что я сделал.
`ибо я в */.МД;делаем mkdir -Р ../документов/то" Я" и &&усилителя; РМ -Р ../документов/то" Я" и &&усилителя; КП " В$Я" и " по../документов/$я" и &АМП;& Эхо " Я -> ../документов/$я и решила попробовать сделать
Что довольно трудно читать, так что давайте разбить его вниз.
первый компакт-диск в каталог с файлами,
`ибо я в */.МД; для каждого файл в свой шаблон
`команды mkdir -Р купила ../документов/&;$я" и сделать этот каталог в папке Docs вне папку, содержащую файлы. Что создает дополнительную папку с именем этого файла.
РМ -Р ../документов/то" Я"
в удалить лишнюю папку, которая была создана в результате команды mkdir -Р
КП " В$Я" и " от../документов/$я"
в скопировать сам файлЭхо " Я -> ../документов/$я"
в Эхе, что ты сделалсделали
жить долго и счастливоОдин быстрый и грязный способ, который получает работу иногда:
Например, чтобы найти количество строк во всех файлах в текущем каталоге, вы можете сделать:
Параметр maxdepth
Я нашел это хорошо работает с Джим Льюис'ы ответ Просто добавьте немного как это:
Заказ# Сортировка
Если вы хотите выполнить сортировку, изменить ее так:
Просто для примера, это будет выполняться в следующем порядке:
Неограниченную Глубину
Если вы хотите исполнять на неограниченную глубину при определенных условиях, вы можете использовать это:
затем положите сверху каждого файлы в каталогах, как ребенок:
и где-то в теле родительского файла:
Принятых/высокого голосовал ответы замечательные, но им не хватает несколько мельчайшие детали. Это сообщение охватывает случаи о том, как лучше обрабатывать, когда корпус имени пути расширения (Глоб) в случае, когда имена файлов содержат встроенные переводы строк/символов тире и двигать команду вывода повторное направление выхода из цикла при записи результатов в файл.
При запуске оболочки Глоб расширения, используя
*
есть возможность для расширения с ошибкой, если есть но файлы в каталоге и ООН расширила Глоб строка будет передан команде должен быть запущен, Что может иметь нежелательные результаты. ВБаш
Shell предоставляет возможность расширенной оболочки для этого, используяnullglob
. Так что цикл в основном будет следующим образом внутри директория, содержащая файлыЭто позволит вам благополучно выйти из цикла, если выражение
./*
возвращает любые файлы ( если каталог пуст)или в POSIX-совместимой путь (
nullglob
этоБаш
конкретно)Это позволяет перейти внутри цикла, если выражение не раз и условие
[ -ф " в файл$то" ]
проверить, если ООН-расширить строку/. *
является допустимым именем файла в этом каталоге, который бы'т быть. Так что на эту ошибку состояние, используя "продолжить" мы вернуться обратно вдля
петли, которая выиграла'т впоследствии работать.Также обратите внимание на использование
--
просто перед передачей аргумента имя файла. Это необходимо потому, что, как уже отмечалось, имена оболочка может содержать дефисы в любом месте в имени файла. Некоторые команды оболочки интерпретировать, что и относиться к ним как опция команды, когда имя не правильно процитировал и выполняет команды, думая, если флаг предоставляется.В
--
сигнализирует об окончании параметров командной строки в этом случае значит, команда должна'т разобрать все строки после этой точки, как флаги команды, но только как имена.Дважды цитируя имена файлов правильно решает случаи, когда имена содержат символы Глоб или пробелы. Но *Никс имена также могут содержать переводы строк в них. Так что мы де-лимит файлов с Единственный персонаж, который не может быть частью действительного именем - нулевой байт (
\0
). ПосколькуБаш
внутренне использует `строки в стиле C, в которой нулевой байт используются для обозначения конца строки, это подходящий кандидат для этого.Таким образом, используя
е
вариант оболочки для разделения файлов с этого нулевого байта, используя-д
вариантчитать
команду, мы можем сделать нижеВ
nullglob
иЕ
объять( .. )
, который означает, что они в основном работают в суб-оболочки (оболочки ребенка), потому что, чтобы избежатьnullglob
возможность отражать на материнской оболочки, после завершения команды. В-д ''в
прочитатькоманда уступчивый _не_ в POSIX, так нужно
БашShell для этого надо делать. Используя
найти команду` это может быть сделано какя думаю, что самое простое решение-это:
ш /реж/* > ./result.txt
Основываясь на подходе @Jim Lewis'a:
Вот быстрое решение с использованием
find
, а также сортировки файлов по дате модификации:Для сортировки см:
http://www.commandlinefu.com/commands/view/5720/find-files-and-list-them-sorted-by-modification-time