我执行这样的ls
命令来列出多个目录。请注意文件夹中的空白区域X y
。
ls -1d 2021*/"X y"/foobar
输出是
'20211121-161518-801/X y/foobar'
'20211128-151513-585/X y/foobar'
'20211130-170001-724/X y/foobar'
看起来 ls 在这里仍然使用引号。但是当我将此输出与xargs
引号结合使用时,接缝会丢失
ls: Zugriff auf '20211121-161518-801/X' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'y/foobar' nicht möglich: Datei oder Verzeichnis nicht gefunden
xargs 命令是这样的
ls -1d 2021*/"X y"/foobar | xargs ls
最后我将使用 axargs rm -rf
但xargs ls
只是一个测试。
虽然 Stéphane Chazelas 总体上给了你很好的和深入了解“现代”的内容
ls
,但并非所有ls
的 es 都是平等的。即使新的 GNUls
会出现--zero
,也需要几十年的时间才能渗透到所有地方,而且这仍然不适用于所有系统,尤其是非基于 GNU 的系统。普遍的共识
ls
是,它是为人类消费而设计的,不应该真正被信任用于其他任何事情。尽管这是老管理员之间相当普遍的知识,但由于许多可以理解(和其他无法解释的)原因,新手和新手管理员仍然完全被
ls
. 随着 Linux 超越利基市场并进入越来越多的主流和国有化环境,这种ls
热爱正成为严重的问题(正如您自己的情况所证明的那样)。这也是为什么 GNUls
正在“快速”增长ls
几十年来任何人都应该拥有的选项的原因。但是,如果您现在真的想可靠、安全地解决这个问题,并且正确的工具是
find
命令:或者用作零分隔列表生成器,或者用作直接命令执行器。find
用作零分隔列表生成器:用作
find
直接执行者:使用
-mindpeth
/-maxdepth
您可以控制find
将下降的深度,通过-type
您控制它将处理哪些对象。您还可以匹配对象名称甚至对象路径。因为find
默认情况下不会以任何“智能”方式破坏或转义对象名称,所以您可以通过管道(生成器)或作为 argv 向量(执行器)的一部分,将这些 anmes 传递给原始而无需担心。请记住,当以这种方式通过管道打乱列表时,
-print0
必须始终使用,以便名称以零分隔,其他字符(如空格和换行符)可以直接表示,不要混淆读者。的 GNU 实现
ls
有一个--quoting-style
选项可让您指定引用样式,但它们都不与xargs
.xargs
(由 PWB Unix 在 70 年代后期引入)引用风格类似于 Bourne shell 的前身 Mashey shell(也来自 PWB Unix)的引用风格。ls --quoting-style=shell-always
按照 Bourne/POSIX shell 样式的单引号引号,单引号本身输入为\'
.xargs
支持反斜杠'...'
和"..."
反斜杠,但引用的字符串不能包含只能用反斜杠转义的换行符。POSIX
xargs
规范还期望xargs
将输入解析为当前语言环境中的文本,并且也不保证它适用于大于 256 字节的参数,因此通常不能用于处理任意数据。真正唯一可靠的使用方法
xargs
是使用某些实现中的-0
选项,例如 GNUxargs
(您通常也希望使用该-r
选项,也是非标准的)。下一个版本的 GNU
ls
将有一个--zero
选项来输出 NUL 分隔的文件,所以你可以这样做:例如。
现在,您可以做的是使用该
--quoting-style=shell-always
模式将该列表传递给 shell,然后该 shell 将其转换为 NUL 分隔的列表:但是,如果您已经在使用
zsh
,那么您实际上并不需要ls
也不可以xargs
按zsh
其他标准对它的 glob 进行排序,例如ls
并具有stat
用于检索文件元数据的内置函数(您可能想要使用的唯一原因ls
)和它自己的zargs
命令。无论如何,在:
它是扩展
*.txt
为匹配文件列表的外壳。ls
在那里非常没用,因为它最终只是打印它们。您不妨将 glob 扩展传递给可以打印以 NUL 分隔的列表的东西,例如
print
内置函数zsh
:(这里也使用
N
ullglob 限定符,所以如果 glob 不匹配任何文件,它不会打印任何内容)。或者在
bash
shell 中(有时仍然在 GNU 系统上使用,因为那是 GNU shell):