我正在尝试列出目录中的文件,并在Mac OS X提示符下对它们执行某些操作.
它应该是这样的:对于f in $(ls -1); 回声$ f; DONE
如果我的名字中没有空格的文件(fileA.txt,fileB.txt),回声工作正常.如果文件名称中包含空格("文件A.txt","文件B.txt"),我会得到4个字符串(文件,A.txt,文件,B.txt).
我试过引用listing命令,但它只改变了问题.
如果我这样做:对于f in $(ls -1); 回声$ f; 我得到了:文件A.txt \nfile B.txt
(它显示正确,但它是一个单独的字符串,我需要分开2行.
如果可能的话,远离ls.使用findutils包中的find.
find /target/path -type f -print0 | xargs -0 your_command_here
-print0
将导致find输出由NUL字符分隔的名称(ASCII为零).-0
xargs 的参数告诉它期望由NUL字符分隔的参数,所以一切都会正常工作.
替换/target/path
为文件所在的路径.
-type f
只会找到文件.使用-type d
的目录,或干脆省略拿到两个.
替换your_command_here
为您将用于处理文件名的命令.(注意:如果你使用echo为your_command_here从shell运行它,你将获得一行上的所有内容 - 不要被那个shell工件搞糊涂,xargs无论如何都会做正确的事情.)
编辑:或者(或者如果你没有xargs),你可以使用效率低得多的
find /target/path -type f -exec your_command_here \{\} \;
\{\} \;
是转义,{} ;
它是当前处理文件的占位符.找到然后将调用your_command_here
与{} ;
由文件名称所取代,而且由于your_command_here
将被发现,而不要启动由外壳的空间都不会有问题.
第二个版本的效率会降低,因为find会为找到的每个文件启动一个新进程.xargs非常智能,可以将命令传递给新启动的进程,如果它能够确保安全的话.如果您有选择,请更喜欢xargs版本.
for f in *; do echo "$f"; done
应该做你想做的事.你为什么用ls
而不是*
?
通常,处理shell中的空格是PITA.看看$IFS
变量,或者更好的是在Perl,Ruby,Python等.