2012-04-03 1 views
2

У меня есть список файлов, из которых я хочу добавить строку в конец файла. Я не могу найти правильный способ:Learning bash: добавьте строку в список файлов

find . | grep filexxx | xargs << echo "attribute=0000" 

Кажется, что не работает, к сожалению. Не написав сценарий, который команда oneliner сделает это?

спасибо!

ответ

8

Вы можете использовать опцию ФАЙНД: -exec нравится:

find . -type f -name "file*" -exec bash -c 'echo "your line" >> $1' -- {} \; 

вам необходимо изменить файл *, чтобы соответствовать файлы, которые вы ищете.

Существует также другая возможность:

find . -type f | while read file; do echo "your line" >> $file ; done 

вы можете найти трубы в Grep или использовать -name в приведенном выше

редактирования:

как предложено knittl в комментариях, вы бы проблемы с вышеуказанным одним лайнером, если ваше имя файла содержит новый символ строки .. и решение предоставлено Gordon:

find . -type f -print0 | while IFS= read -r -d '' file; do ... 
+2

Заметьте, что 'найти | while' может вызвать проблемы, если ваши имена файлов содержат символы новой строки , – knittl

+0

@knittl: Правильно; Чтобы избежать проблем, используйте 'find. -тип f -print0 | в то время как IFS = read -r -d '' файл; do ... 'вместо этого. –

0

Существует много способов сделать это. Ответ wisent - один. Вот другой, возможно, более интуитивно, даже если он порождает несколько процессов:

for fname in $(find . | grep filexxx) ; do echo "attribute=0000" >> $fname ; done 
6

Или использовать простой цикл:

for f in *txt; do echo "yada" >> "${f}"; done 
+0

Это не будет работать для файлов в поддиректорах. Кроме того, вам не нужно дважды указывать '$ {f}'. – bos

+0

Я не знал, что это требование, ОП только сказал «список файлов», ничего о глубине там нет. Я обычно цитирую при интерполяции переменных в Bash из-за космических побочных эффектов. пример 'while read' в другом комментарии будет более подходящим для правильной обработки пробелов в файлах. – objectified

+0

Я не знаю, является ли это требованием или нет, я просто уточнил :-) В случае, если OP ожидает, что он войдет в подсистемы. – bos