Добавить строку во многие файлы

Я хочу добавить текст в более чем 200 000 файлов, которые я пытаюсь

find . -name *.txt -print | xargs -I % echo "hello world" >> % 

Но ничего не происходит. Когда я запустил find . -name *.txt find . -name *.txt работает сам по себе, как и echo "hello world" >> myfile.txt

Оболочка расширяет часть >> % до того, как xargs видит.

Если вам нужно выполнить перенаправление оболочки, вам нужно попробовать что-то вроде этого:

 find . -name "*.txt" -exec sh -c ' echo "hello world" >> "$0" ' {} \; 

Как это работает:

  1. find заменяет {} на каждый файл, который соответствует
  2. bash -c "some command" arg0... устанавливает $0... внутри скрипта "some command"

Кроме того, вы можете использовать команду, например sed , которая не полагается на >> например

 find . -name "*.txt" -exec sed -i -e '$a\ hello world' {} \; 

Рекомендации:

  • Вызов Bash
  • Найти – выполнить команды – одиночный файл
  • Sed – Менее часто используемые команды

С помощью GNU Parallel вы можете:

 find . -name *.txt -print | parallel 'echo "hello world" >> {}' 

Вы можете установить GNU Parallel, просто:

 wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel chmod 755 parallel cp parallel sem 

Смотрите видеоролики для GNU. Параллельно узнайте больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Оригинальная команда, которую вы пытались …

 find . -name *.txt -print | xargs -I % echo "hello world" >> % 

необходимо изменить на

 find . -name "*.txt" | xargs -I {} sh -c "echo 'hello world' >> '{}' "