将每个文本文件的名称附加到文件的最后一行

将每个文本文件的名称附加到文件的最后一行

我有十个文件:firstFile.txt,...,tenthFile.txt

在文件的最后一行,我想附加文件名。

即对于第一个,最后一行将是“firstFile”

我想用一行代码执行此操作

答案1

使用zsh, 将文件名删除其扩展名(root 名称)的行添加到每个非隐藏的末尾常规的文件(不是目录、符号链接、管道、设备...):

for f (*(N.)) print -r - $f:r >> $f

使用sh/ bash(也可以使用zsh):

for f in *; do
  [ -f "$f" ] && [ ! -L "$f" ] && printf '%s\n' "${f%.*}" >> "$f"
done

请注意,这些循环的退出状态将是这些循环中最后运行的 and-or 列表的退出状态。

要使退出状态仅在脚本无法更新文件时才不成功,您可以执行以下操作:

#! /bin/zsh -
ret=0
for f (*(N.)) print -r - $f:r >> $f || ret=$?
exit $ret

或者:

#! /bin/sh -
ret=0
for f in *; do
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  printf '%s\n' "${f%.*}" >> "$f" || ret="$?"
done
exit "$ret"

答案2

bash-4.4$ touch firstFile.txt
bash-4.4$ touch secondfile.txt
bash-4.4$ ls * | while read fn ; do echo "$fn" >>"$fn" ; done
bash-4.4$ cat *
firstFile.txt
secondfile.txt

显然,您可能需要更改*以适合您的特定情况。ls对于更复杂的情况,您可能需要考虑更改 a find

编辑:如果您想删除“.txt”,请更改echo "$fn"echo "${fn%%.txt}"上面的行。

(我知道ls *这很奇怪,但星号在示例中充当位置标记)

相关内容