忽略文件名包含换行符的可能性,您可以使用pringley 在他的answer 中建议的sed,或者您可以使用read 命令创建while 循环:
find . |
while read -r line
do
echo "$line$line"
done
(-r 用于“原始”输入;它会阻止 shell 扩展输入中的反斜杠转义序列,并且是 shell 中 read 命令的标准 POSIX 功能。)
由于您提到bash,您可以使用find . -print0 选项以空字节(C 中的'\0')代替换行符来终止每个名称,然后使用:
find . -print0 |
while read -r -d '' line
do
echo "X${line}${line}X"
done
-d '' 用字符串参数的第一个字符替换了正常的换行符分隔符,但字符串为空,所以第一个字符是唯一的字符是空字节。
没有一种简单的方法(据我所知,也没有一种困难的方法)来使用 for 循环,如下所示:
for line in $(find .)
do
echo "X${line}${line}X"
done
这对于带有空格或换行符的名称可靠地工作。
通常,您可能想要使用xargs 命令。这会读取标准输入并使用从标准输入中读取的内容作为命令的参数创建命令行。
find . | xargs wc -l
或者,使用换行符和空格安全(默认情况下,xargs 在空格、制表符和换行符处拆分参数):
find . -type f -print0 | xargs -0 wc -l
您可以向xargs 申请很多选项——尤其是 GNU 版本。
但是,您也可以选择find,这在很大程度上使xargs 变得多余:
find . -type f -exec wc -l {} +
它与find . -print0 | xargs -0 wc -l 命令的工作基本相同。一个区别是,如果find 的输出中没有文件,那么使用-exec 根本不会执行wc,而默认情况下,xargs 将执行一次(没有文件名参数;这是为了符合 POSIX 标准)。使用 GNU xargs,您可以使用 -r 或 --no-run-if-empty 来阻止这种情况的发生。 Mac OS X xargs 似乎无论如何都会这样做。