我有 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" ] &&
printf
dir_*/
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 变量中并对其进行处理。