如何在每个子目录中创建一个文本文件,以便该文本文件包含目录名称

如何在每个子目录中创建一个文本文件,以便该文本文件包含目录名称

我有 5 个空目录:

[X]$ ls
dir_1  dir_2  dir_3  dir_4  dir_5

如何在每个目录中创建一个文本文件,以便该文本文件包含其所在目录的名称?例如,dir_1将包含文本文件file_1.txt并且该文本文件dir_1中包含文本,dir_2包含文本文件中file_2.txt包含文本dir_2等等。

我搜索了信息,但我无法弄清楚这一点。我最近开始学习linux。我必须做类似的事情吗:

find . -type d -exec touch (something?)

是否可以使用 for 循环来做到这一点?

答案1

for d in dir_*; do
    printf "%s\n" "$d" > "$d/file_${d##*_}.txt"
done
  • $d扩展到每个目录名称。
  • ${d##*_}扩展为目录名称中的尾随数字,因为它会删除$d.阅读更多内容,请参阅参数扩展部分BASH 手册或者POSIX规范
  • printf "%s\n" "$d" > "$d/file_${d##*_}.txt"将目录名称写入该目录中的 txt 文件。

与单行:

for d in dir_*; do printf "%s\n" "$d" > "$d/file_${d##*_}.txt"; done

我之所以赞成printf,是echo因为有些特殊情况可以由前者正确处理,但后者不能正确处理,尽管在所提出的特定情况下echo不会出现问题。查找更多信息为什么 printf 比 echo 更好?


如果您需要避免也以 开头的非目录,选项 1 是在上面脚本中的语句之前dir_添加测试。使用选项 2以便仅匹配目录:[ -d "$d" ] &&printfdir_*/

for d in dir_*/; do
    dirn=${d%%/}
    printf "%s\n" "$dirn" > "${d}file_${dirn##*_}.txt"
done

答案2

find . -name 'dir_[0-9]*'  -type d -execdir bash -c 'name=$0;printf "${name##*/}\n" > "$name/file_${name##*_}.txt"' '{}' \;

使用查找结果执行多个命令-execdir

name=$0;=> 将每个目录名称存储在 $name 变量中并对其进行处理。

相关内容