如何將文件名稱添加到每行末尾 - 所有子目錄中的所有文件

如何將文件名稱添加到每行末尾 - 所有子目錄中的所有文件

我想在 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

perlfind

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擴充功能(asinplace或),有人可能已經在其中植入了惡意軟體。隨系統提供的擴展inplace.awk的路徑可能會有所不同,請參閱輸出inplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

答案3

試試這個,使用findsed

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

替換/path/to/top_directory為您要編輯的文件所在的目錄。

相關內容