2

我想遍历 Bash 中的文件列表并执行一些操作。问题:文件名可能包含空格,这会产生一个明显的通配符问题或ls

touch a\ b
FILES=* # or $(ls)

for FILE in $FILES; do echo $FILE; done

产量

a
b

现在,处理这个问题的传统方法是使用find … -print0。但是,这只适用于(很好地)与 Bash 变量/循环一起使用xargs -0,而不是与 Bash 变量/循环一起使用。

我的想法是设置$IFS为空字符来完成这项工作。但是, comp.unix.shell 似乎认为这在 bash 中是不可能的

真可惜。嗯,理论上是可以使用其他字符的,比如:(毕竟$PATH也使用这种格式):

IFS=$':'
FILES=$(find . -print0 | xargs -0 printf "%s:")

for FILE in $FILES; do echo $FILE; done

(输出略有不同,但足够公平。)

但是,我不禁觉得这很笨拙,应该有更直接的方法来做到这一点。我正在寻找一种更直接的方法来实现这一点,最好使用通配符或ls.

4

3 回答 3

3

处理这个问题的最好方法是将文件列表存储为一个数组,而不是一个字符串(并确保双引号所有变量替换):

files=(*)
for file in "${files[@]}"; do
    echo "$file"
done

如果您想从find的输出中生成一个数组(例如,如果您需要递归搜索),请参阅这个先前的答案

于 2012-04-18T14:37:22.553 回答
1

您在第一个示例中所拥有的内容在 Msys Bash、Cygwin 和我的 Fedora 机器上对我来说很好:

FILES=*
for FILE in $FILES
do
    echo $FILE
done
于 2012-04-18T13:25:25.107 回答
-2

前进非常重要

IFS=""

否则将找不到后面有两个空格的文件

于 2017-04-10T15:07:38.150 回答