列出带有空格的文件夹的循环

Nic*_*ela 1 shell bash quoting wildcards

方法

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

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

$ ls -la
./
../
35._JK_io/
'43A. io kl_ -'/
'Mi.Nombre.es Adios'/
Run Code Online (Sandbox Code Playgroud)

注意:我们已经尝试 (creo) 列出所有的可能性,并在区分目录和文件夹时起作用。

现在,我继续创建一个循环,以便只列出目录并(将来)重命名它们:

for archives in `sh -c 'ls -q */' sh`

do

echo  "$archives"
done
Run Code Online (Sandbox Code Playgroud)

问题

问题是,当我运行脚本时,我得到:

35._JK_io/:
43A.
io
kl_
-/:
Mi.Nombre.es
Adios/:
Run Code Online (Sandbox Code Playgroud)

我如何防止这种情况发生在我身上并以空格和只有三个文件的形式出现?

观察

在文件夹上执行其他脚本时,它获得的35._JK_io /是一个目录,但其他两个不是

谢谢!!

Kus*_*nda 5

当循环目录时,尤其是当这些目录具有时髦的名称时,不要循环ls. 通常,在程序之间传递路径名需要非常谨慎,因为 Unix 文件名可能包含除/和 空字符 ( \0)之外的任何字符。

反而

for dirname in ./*/; do
    printf 'Directory name is "%s"\n' "$dirname"
done
Run Code Online (Sandbox Code Playgroud)

最后/在模式./*/使得图案扩展到只有目录。该dirname变量会得到这样的价值./some directory name/这样做的时候。我包含./在模式的开头,但如果您愿意,可以删除它。请注意,如果您的目录-的名称中的第一个字符是破折号 ( ),那么您稍后必须使用 eg mv -- "$dirname" "$newname"(与--)来停止mv将名称中的破折号解释为命令行选项。随着./在开始$dirname时,--是没有必要的。

这是额外的引用变量扩展作为外壳,否则做分词和文件匹配上的值很重要。

有关的: