在bash脚本中,我想迭代当前工作目录中的所有目录并对它们进行操作。它们可能包含特殊符号,尤其是空格。我怎样才能做到这一点?我有:
for dir in $( ls -l ./)
do
if [ -d ./"$dir" ]
但是这会在名字中用空格跳过我的目录。任何帮助表示赞赏。
答案 0 :(得分:34)
尝试一下:
for dir in */
答案 1 :(得分:11)
选择解决方案:
http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html
一般的想法是更改默认分隔符(IFS)。
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in *
do
echo "$f"
done
IFS=$SAVEIFS
答案 2 :(得分:2)
有多种方法。这是非常快的事情:
find /your/dir -type d -print0 | xargs -0 echo
这将以递归方式扫描/ your / dir目录,并将所有路径传递给命令“echo”(根据需要进行交换)。它可以多次调用echo,但它会尝试传递控制台允许的目录名。这非常快,因为需要启动的进程很少。但它仅适用于可以采用任意数量值作为选项的程序。 -print0告诉find使用零字节分隔文件路径(-0告诉xargs读取由零字节分隔的参数) 如果你没有后者,你可以这样做:
find /your/dir -type d -print0 | xargs -0 -n 1 echo
或
find /your/dir -type d -print0 --exec echo '{}' ';'
选项-n 1将告诉xargs不要将多个参数同时传递给您的程序。 如果您不希望find以递归方式扫描,则可以指定depth选项以禁用递归(尽管不知道语法)。
虽然在你的特定脚本中可用的是另一个问题; - )。