在bash中使用“ls”for循环是否安全

时间:2011-05-05 13:25:10

标签: linux bash

我用它来遍历/ home目录中的文件夹

for FOLDERNAME in `\ls -1 /home/`

我想知道它是否安全

3 个答案:

答案 0 :(得分:6)

如果您想要/home中的所有子目录,请使用

(   # run in subshell so "shopt -s dotglob" doesn't affect rest of script
    shopt -s dotglob
    for DIR in /home/*/; do
       DIRNAME=`basename "$DIR"`

       # do whatever with "$DIR" or "$DIRNAME"
       echo -n "$DIRNAME"|od -t cz
    done
)

请注意尾部斜杠和引用的变量。

修改

使用目录和文件

mkdir /home/..abc
mkdir /home/.abc
mkdir /home/$'a\nc'
mkdir /home/'a?c'
mkdir /home/abc
mkdir /home/'foo bar'
touch /home/test

这给了我输出

0000000   .   .   a   b   c                                              >..abc<
0000005
0000000   .   a   b   c                                                  >.abc<
0000004
0000000   a  \n   c                                                      >a.c<
0000003
0000000   a   ?   c                                                      >a?c<
0000003
0000000   a   b   c                                                      >abc<
0000003
0000000   f   o   o       b   a   r                                      >foo bar<
0000007

,其中

ls -1 -F -b -A /home

给我输出

..abc/
.abc/
a\nc/
a?c/
abc/
foo bar/
test

test是一个文件)

答案 1 :(得分:3)

No。如果你真的是偏执狂,你可以使用Safe Find(R)(C)(TM)(FLOSS)。

while IFS= read -r -d '' -u 9
do
    some_command "${REPLY}"
done 9< <( find "/home" -print0 )

答案 2 :(得分:-1)

find -type d -execdir COMMAND {} +

是这样做的方法。查找将组织,包含空格和换行符等的名称正确传递给COMMAND。 +将允许传递多个名称 - 您可以使用... {} ";"代替。而不是-execdir你可以使用-okdir,它要求确认(非常安全!:))。