我需要创建一个脚本来扫描目录中的文件夹并获取每个文件夹的名称,创建一个 .txt 文件,用文件夹的名称命名并将其放入该文件夹中。
例如:一个目录中有 3 个名为“1”、“2”和“3”的文件夹 我想在以该文件夹名称命名的每个文件夹中创建一个 .txt 文件,以便文件夹 1 具有“1.txt”在文件夹2中有“2.txt”等。
我设法用这个脚本做到这一点:
for i in $(ls -d */); do touch "$i $(basename $i).txt" ; done
问题是我想做同样的事情,但是对于名称中包含空格的文件夹。例如:如果我有一个名为“Test Me”的文件夹,它将给出如下错误:
Me: no directory with that name
它只会看到“Me”一词,并将其视为一个文件夹,而不是整个“Test Me”。
我怎样才能做到这一点 ?
更新
这就是解决方案,下面由 TAAPSogeking 评论(再次感谢他)
for dir in *; do [ -d "$dir" ] && touch "$dir/$dir.txt"; done
答案1
假设您只需要立即目录而不是所有嵌套子目录。以下假设您当前位于相同的目录和要循环的目录中
for dir in *; do
[ -d "$dir" ] && touch -- "$dir/$dir.txt"
done
- 这将循环当前目录中的每个文件
- 过滤目录(包括目录的符号链接)。
- 然后在指定目录下创建请求的文件
您可能还感兴趣外壳检查指出常见错误/不良做法(例如在本例中使用 ls)
答案2
有了zsh
,你可以这样做:
touch -- *(/e['REPLY+=/$REPLY.txt'])
其中/
glob 限定符将 glob 扩展限制为文件类型目录-/
(如果您还想考虑目录的符号链接,请更改为),并且e
限定符e
评估给定的代码以修改路径(存储在 中$REPLY
)。添加D
(对于D
ot 文件)限定符也可以对隐藏目录执行此操作(.
并且..
在任何情况下都不包含)。