
Я хочу добавить строку в свой скрипт 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 inplace
as сначала 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
на каталог, в котором находятся файлы, которые вы хотите редактировать.