当我运行时,for i in $(find -name '*.ogg'); do echo '$i'; done
我没有像预期的那样得到每个文件一行。相反,当文件名中有空格时,每个单词都会出现在单独的行中,因此我无法在文件上运行命令。
答案1
find -name '*.ogg' -print0 | xargs -0 -L1 command
答案2
以下是您可能想要做的一个例子:
#! /bin/sh
IFS="\n"
for xxx in `cat /etc/hosts`
do
echo $xxx
done
exit 0
IE:将 IFS(字段间分隔符)更改为 \n,而不是空格、制表符、\n
答案3
您应该改为插入find
循环while
:
find -name '*.ogg' | while read -r i; do echo "$i"; done
此外,您使用的单引号$i
会阻止变量扩展为其值。
另一种方法是使用进程替换:
while read -r i; do echo "$i"; done < <(find -name '*.ogg')
这样做的好处是不会在while
循环外创建子 shell,因此循环内设置的变量(以及对环境的其他更改)在循环完成后仍然可用。
答案4
在这种情况下也没有必要find
。您可以设置globstar
选项并使用 bash 通配符。
shopt -s globstar
for i in **/*.ogg; do echo '$i'; done