Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Unix中,如何处理名称中包含空格的文件列表?_Macos_Unix_List_Shell_File - Fatal编程技术网

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

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文

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

(它显示正确,但它是一个字符串,我需要两行分开

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会有所帮助。