如何将文件名添加到每行末尾 - 所有子目录中的所有文件

如何将文件名添加到每行末尾 - 所有子目录中的所有文件

我想在 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为您要编辑的文件所在的目录。

相关内容