
我想在 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
擴充功能(asinplace
或),有人可能已經在其中植入了惡意軟體。隨系統提供的擴展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
為您要編輯的文件所在的目錄。