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

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

Я хочу добавить строку в свой скрипт 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/$/;%/' %

решение1

С perlиfind

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

решение2

С GNU awk:

LC_ALL=C find . -type f -exec gawk -i /usr/share/awk/inplace.awk '
  BEGINFILE {suffix = FILENAME; sub(/.*\//, "", suffix)}
  {print $0, suffix}' {} +

Помните, что если имеется несколько жестких ссылок на один и тот же файл, имя каждой из них будет добавлено (в произвольном порядке) к каждой строке этого файла.

В любом случае,не использовать-i inplaceas сначала gawkпытается загрузить inplaceрасширение (как inplaceили inplace.awk) из текущего рабочего каталога, где кто-то мог разместить вредоносное ПО. Путь расширения, inplaceпоставляемого с, gawkможет различаться в зависимости от системы, см. выводgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

решение3

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

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

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

Связанный контент