方法

方法

方法

我有一个目录,其中包含随机命名的文件夹,其中包含空格和句点。

我创建了一个小循环(在脚本中),目的是重命名这些文件夹。基于这些是我的目录(测试并清空):

$ 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 会对值进行分词和文件名通配。

有关的:

相关内容