Как добавить имя файла в конец каждой строки - все файлы во всех подкаталогах

Я хочу добавить строку в мой сценарий bash (ubuntu 16), чтобы добавить имя файла в конец каждой строки в файле - то есть каждый файл в папке и все файлы во всех подпапках.

Имена файлов являются буквенно-цифровыми с некоторыми специальными символами, такими как -_.

Например:

Строка в файле filename_ghrut.txt до:

blah blah blah
blahblah blahblah

Строка в файле filename_ghrut.txt после:

blah blah blah filename_ghrut.txt
blahblah blahblah filename_ghrut.txt

Я искал вокруг, но большинство команд, кажется, не работают.

Я хочу запустить это для всех файлов во всех подкаталогах определенного каталога.

Большая благодарность.

Я нашел это, но это не совсем работает:

ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %
0
29.04.2017, 05:16
2 ответа

Попробуйте это, используя find и sed:

find /path/to/top_directory -type f -execdir sed -i -e "s/$/ {}/" {} \;

Замените /path/to/top_directory на каталог, в котором находятся файлы, которые вы хотите отредактировать.

-1
28.01.2020, 04:46

С помощью perl и find

find . -type f -exec perl -i -pe 's/$/ $ARGV/' {} +
  • s/$/ $ARGV/ добавьте пробел и имя файла в конец каждой строки
  • -i для редактирования на месте, используйте i.bkp, если вы хотите сохранить резервную копию исходных файлов.
  • Если ваш find не поддерживает +, используйте \; вместо
  • найти . -type f выдаст список всех файлов в текущем каталоге
  • -exec позволяет использовать команду для работы со всеми этими файлами
  • Use find . -type f -name '*.txt', если вы хотите ограничиться только файлами, заканчивающимися на .txt


Спасибо @thiagowfx за указание на то, что приведенное выше решение добавит имя файла как ./file. txt, ./foo/file2.txt и т. д.

Используйте это, чтобы добавить только имя файла без каких-либо ./ и т. д.

find . -type f -exec perl -i -pe 's/$/$ARGV=~s|.*\/| |r/e' {} +
  • $ARGV=~s|. *\/| |r даст имя файла, в котором все символы до / удалены
1
28.01.2020, 04:46

Теги

Похожие вопросы