方法
我有一个目录,其中包含随机命名的文件夹,其中包含空格和句点。
我创建了一个小循环(在脚本中),目的是重命名这些文件夹。基于这些是我的目录(测试并清空):
$ ls -la
./
../
35._JK_io/
'43A. io kl_ -'/
'Mi.Nombre.es Adios'/
注意:我们已尝试 (creo) 列出所有可能性,并在区分目录和文件夹时发挥作用。
现在,我继续创建一个循环,以便仅列出目录和 (将来)重命名它们:
for archives in `sh -c 'ls -q */' sh`
do
echo "$archives"
done
问题
问题是,当我运行脚本时,我得到:
35._JK_io/:
43A.
io
kl_
-/:
Mi.Nombre.es
Adios/:
问题
如何防止这种情况发生在我身上并出现空格且只有三个文件?
观察
当在文件夹上执行其他脚本时,它获得的35._JK_io /
是一个目录,但其他两个不是
谢谢你!!
答案1
当循环遍历目录时,尤其是当这些目录具有时髦的名称时,不要循环遍历ls
.一般来说,在程序之间传递路径名需要非常小心,因为 Unix 文件名可能包含除/
nul 字符 ( \0
) 之外的任何字符。
反而
for dirname in ./*/; do
printf 'Directory name is "%s"\n' "$dirname"
done
/
模式中的最后一个./*/
使模式仅扩展到目录。执行此操作时,变量dirname
将获得类似的值./some directory name/
。我将其包含./
在模式的开头,但如果您愿意,可以将其删除。请注意,如果您的目录的名称中以破折号 ( -
) 作为第一个字符,那么您稍后必须使用eg mv -- "$dirname" "$newname"
(与--
)一起停止mv
将名称中的破折号解释为命令行选项。以./
开头$dirname
,则--
不需要。
这是额外的引用变量扩展很重要,否则 shell 会对值进行分词和文件名通配。
有关的: