Я хочу добавить строку в мой сценарий 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/$/;%/' %
Попробуйте это, используя find
и sed
:
find /path/to/top_directory -type f -execdir sed -i -e "s/$/ {}/" {} \;
Замените /path/to/top_directory
на каталог, в котором находятся файлы, которые вы хотите отредактировать.
С помощью perl
и find
find . -type f -exec perl -i -pe 's/$/ $ARGV/' {} +
s/$/ $ARGV/
добавьте пробел и имя файла в конец каждой строки -i
для редактирования на месте, используйте i.bkp
, если вы хотите сохранить резервную копию исходных файлов. 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
даст имя файла, в котором все символы до /
удалены