Macos 在Unix中,如何处理名称中包含空格的文件列表?
我正在尝试列出目录中的文件,并在MacOSX提示符中对它们执行一些操作 它应该是这样的:对于f(ls-1);不要重复$f;完成 如果文件名中没有空格(fileA.txt、fileB.txt),则echo可以正常工作。 如果文件名中包含空格(“file A.txt”、“file B.txt”),我会得到4个字符串(file、A.txt、file、B.txt) 我尝试引用listing命令,但它只改变了问题 如果我这样做:对于f,单位为$(ls-1);不要重复$f;完成 我得到:文件A.txt\n文件B.txt (它显示正确,但它是一个字符串,我需要两行分开Macos 在Unix中,如何处理名称中包含空格的文件列表?,macos,unix,list,shell,file,Macos,Unix,List,Shell,File,我正在尝试列出目录中的文件,并在MacOSX提示符中对它们执行一些操作 它应该是这样的:对于f(ls-1);不要重复$f;完成 如果文件名中没有空格(fileA.txt、fileB.txt),则echo可以正常工作。 如果文件名中包含空格(“file A.txt”、“file B.txt”),我会得到4个字符串(file、A.txt、file、B.txt) 我尝试引用listing命令,但它只改变了问题 如果我这样做:对于f,单位为$(ls-1);不要重复$f;完成 我得到:文件A.txt\n文
for f in *; do echo "$f"; done
应该做你想做的。你为什么用ls
而不是*
一般来说,在shell中处理空格是一个PITA。请查看
$IFS
变量,或者更好地查看Perl、Ruby、Python等。查看xargs的手册页:
它的工作原理如下:
ls-1/tmp/*.jpeg|xargs rm下面是一个使用$IFS的答案,正如derobert所讨论的
尽可能远离ls。使用findutils软件包中的find
在此处查找/target/path-type f-print0 | xargs-0您的命令
-print0
将导致find输出以NUL字符分隔的名称(ASCII零)。xargs的-0
参数告诉它也需要以NUL字符分隔的参数,因此一切都可以正常工作
将/target/path
替换为文件所在的路径
-type f
将仅定位文件。使用-type d
查找目录,或完全忽略以获取两者
将您的_命令\u替换为您将用于处理文件名的命令。
(注意:如果您使用echo从shell运行此命令,您的_命令\u将在一行中获得所有内容-不要被该shell工件弄糊涂,xargs无论如何都会做正确的事情。)
编辑:或者(或者如果没有xargs),可以使用效率低得多的
find/target/path-type f-exec您的_命令_here\{\};
\{\}\
是当前处理文件的占位符{};
的转义。然后,find将在这里调用您的{u命令
,并用文件名替换{};
,因为您的{u命令
将由find启动,而不是由shell启动,所以空格就无关紧要了
第二个版本的效率较低,因为find将为找到的每个文件启动一个新进程。如果xargs认为这样做是安全的,它足够聪明,可以将命令通过管道传输到新启动的进程。如果您有选择,请选择xargs版本。您可以将参数通过管道传输到
读取
。例如,到cat
目录中的所有文件:
ls -1 | while read FILENAME; do cat "$FILENAME"; done
这意味着您仍然可以使用问题中提到的ls
,或者任何其他生成$IFS
分隔输出的命令
在我看来,while
循环可以更容易地对参数执行几项操作,并使复杂的处理更具可读性。一个精心设计的示例:
ls -1 | while read FILE
do
echo 1: "$FILE"
echo 2: "$FILE"
done
看——引用样式选项。
例如,--quoting style=c将产生:
$ls--报价样式=c
“文件1”“文件2”“目录1”
如果只需要一个简单的ls-1,那么是的:将其替换为*.OP可能还有其他要求-例如,在按时间修改顺序处理文件时,我总是遇到这个问题。好吧,无论何时使用ls,或多或少都会遇到这个问题,因为文件名可能有新行。您需要切换到其他ap方法(例如find/xargs、perl/ruby/python、bash数组+大量工作)如果您需要在一个文件上运行多个命令,xargs就不能很好地工作。当然,您可以使用shell脚本作为单个命令。True。然后总是要查找-exec参数(尽管,正如您所指出的,大多数问题都可以通过单独的shell脚本使用xargs进行重新表述。)这最多只是答案的一小部分,如果没有更完整的解释,您的答案是没有帮助的。如果只有空格(和制表符),这会有所帮助;如果名称中有换行符,则没有帮助。在这种情况下,find-print0和xargs-0会有所帮助。