Вы можете сделать что-то подобное (но я бы не рекомендовал его вообще).
find dir -print0 |
xargs -0 -n 2 awk -v OFS='\0' '<process the input and write to temporary file>
END {print "temporaryfile", FILENAME}' |
xargs -0 -n 2 mv
Это передает файлы awk
непосредственно два одновременно (что исключает проблему с оригиналом где cat
получите сотни (возможно, более) файлы в качестве аргументов все сразу и плюнуть все их содержания в awk
через стандартный ввод одновременно и, таким образом, полностью теряют свое индивидуальное содержимое и имена файлов).
Затем он имеет awk
написать обработанный вывод во временный файл, а затем выводит имя временного файла и исходное имя файла, где xargs
забирает их (опять два одновременно) и работает mv
на пары временного файла/исходный файл имена.
Как я уже сказал в начале, это ужасный способ сделать это.
Если у вас есть достаточно новую версию GNU awk
(версии 4.1.0 или более поздней версии), то вы можете просто использовать аргумент -i
(на месте), чтобы awk
и использовать (я считаю):
find dir | xargs awk -i '......'
Без этого я бы использовал цикл while
формы в Bash FAQ 001, чтобы читать вывод find
по очереди и работать с ним в цикле.
Какая у вас проблема? –
напишите сценарий и передайте имя файла 'find dir -exec myscript {} \;' где myscript начинается с типа 'name = '$ 1" 'и делает cat, awk и т. Д. –
' xargs cat' здесь бессмыслен (и не будет работать, потому что он будет комбинировать файлы). 'xargs awk' будет лучше (и позволит' awk' обрабатывать каждый файл независимо, включая запуск 'mv', если вы действительно этого хотите. –