![如何将文件名添加到每行末尾 - 所有子目录中的所有文件](https://linux22.com/image/110571/%E5%A6%82%E4%BD%95%E5%B0%86%E6%96%87%E4%BB%B6%E5%90%8D%E6%B7%BB%E5%8A%A0%E5%88%B0%E6%AF%8F%E8%A1%8C%E6%9C%AB%E5%B0%BE%20-%20%E6%89%80%E6%9C%89%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6.png)
我想在 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
为您要编辑的文件所在的目录。