当前位置:  开发笔记 > IOS > 正文

如何处理Unix中名称中包含空格的文件列表?

如何解决《如何处理Unix中名称中包含空格的文件列表?》经验,为你挑选了2个好方法。

我正在尝试列出目录中的文件,并在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行.



1> Mihai Limbăș..:

如果可能的话,远离ls.使用findutils包中的find.

find /target/path -type f -print0 | xargs -0 your_command_here

-print0将导致find输出由NUL字符分隔的名称(ASCII为零).-0xargs 的参数告诉它期望由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版本.



2> derobert..:
for f in *; do echo "$f"; done

应该做你想做的事.你为什么用ls而不是*

通常,处理shell中的空格是PITA.看看$IFS变量,或者更好的是在Perl,Ruby,Python等.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有