AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 683055
Accepted
buhtz
buhtz
Asked: 2021-12-20 00:49:04 +0800 CST2021-12-20 00:49:04 +0800 CST 2021-12-20 00:49:04 +0800 CST

如何使“ls -1”结合xargs在引号中打印出来?

  • 772

我执行这样的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只是一个测试。

ls xargs
  • 2 2 个回答
  • 130 Views

2 个回答

  • Voted
  1. Best Answer
    etosan
    2021-12-20T11:10:54+08:002021-12-20T11:10:54+08:00

    虽然 Stéphane Chazelas 总体上给了你很好的和深入了解“现代”的内容ls,但并非所有ls的 es 都是平等的。即使新的 GNUls会出现--zero,也需要几十年的时间才能渗透到所有地方,而且这仍然不适用于所有系统,尤其是非基于 GNU 的系统。

    普遍的共识ls是,它是为人类消费而设计的,不应该真正被信任用于其他任何事情。

    尽管这是老管理员之间相当普遍的知识,但由于许多可以理解(和其他无法解释的)原因,新手和新手管理员仍然完全被ls. 随着 Linux 超越利基市场并进入越来越多的主流和国有化环境,这种ls热爱正成为严重的问题(正如您自己的情况所证明的那样)。这也是为什么 GNUls正在“快速”增长ls几十年来任何人都应该拥有的选项的原因。

    但是,如果您现在真的想可靠、安全地解决这个问题,并且正确的工具是find命令:或者用作零分隔列表生成器,或者用作直接命令执行器。

    find用作零分隔列表生成器:

    find topdir -mindepth 1 [-maxdepth 2] -type d -print0 | xargs -0 -I@ stat @
    

    用作find直接执行者:

    find topdir -mindepth 1 [-maxdepth 2] -type d -exec stat '{}' \;
    

    使用-mindpeth/-maxdepth您可以控制find将下降的深度,通过-type您控制它将处理哪些对象。您还可以匹配对象名称甚至对象路径。因为find默认情况下不会以任何“智能”方式破坏或转义对象名称,所以您可以通过管道(生成器)或作为 argv 向量(执行器)的一部分,将这些 anmes 传递给原始而无需担心。

    请记住,当以这种方式通过管道打乱列表时,-print0必须始终使用,以便名称以零分隔,其他字符(如空格和换行符)可以直接表示,不要混淆读者。

    • 3
  2. Stéphane Chazelas
    2021-12-20T03:57:18+08:002021-12-20T03:57:18+08:00

    的 GNU 实现ls有一个--quoting-style选项可让您指定引用样式,但它们都不与xargs.

    xargs(由 PWB Unix 在 70 年代后期引入)引用风格类似于 Bourne shell 的前身 Mashey shell(也来自 PWB Unix)的引用风格。

    ls --quoting-style=shell-always按照 Bourne/POSIX shell 样式的单引号引号,单引号本身输入为\'. xargs支持反斜杠'...'和"..."反斜杠,但引用的字符串不能包含只能用反斜杠转义的换行符。

    POSIXxargs规范还期望xargs将输入解析为当前语言环境中的文本,并且也不保证它适用于大于 256 字节的参数,因此通常不能用于处理任意数据。

    真正唯一可靠的使用方法xargs是使用某些实现中的-0选项,例如 GNU xargs(您通常也希望使用该-r选项,也是非标准的)。

    下一个版本的 GNUls将有一个--zero选项来输出 NUL 分隔的文件,所以你可以这样做:

    ls -t --zero | xargs -r0 printf ' * %s\n'
    

    例如。

    现在,您可以做的是使用该--quoting-style=shell-always模式将该列表传递给 shell,然后该 shell 将其转换为 NUL 分隔的列表:

    (
       echo 'files=('
       ls --quoting-style=shell-always -t
       echo '); print -rNC1 -- $files'
    ) | zsh | xargs -r0 some command
    

    但是,如果您已经在使用zsh,那么您实际上并不需要ls也不可以xargs按zsh其他标准对它的 glob 进行排序,例如ls并具有stat用于检索文件元数据的内置函数(您可能想要使用的唯一原因ls)和它自己的zargs命令。

    无论如何,在:

    ls -d -- *.txt
    

    它是扩展*.txt为匹配文件列表的外壳。ls在那里非常没用,因为它最终只是打印它们。

    您不妨将 glob 扩展传递给可以打印以 NUL 分隔的列表的东西,例如print内置函数zsh:

    print -rNC1 -- *.txt(N)
    

    (这里也使用Nullglob 限定符,所以如果 glob 不匹配任何文件,它不会打印任何内容)。

    或者在bashshell 中(有时仍然在 GNU 系统上使用,因为那是 GNU shell):

    print0() {
      [ "$#" -eq 0 ] || printf '%s\0' "$@"
    }
    shopt -s nullglob
    print0 *.txt
    
    • 2

相关问题

  • 管道 ls 是否与 ls -1 相同?

  • 这个 xargs 命令有什么问题?

  • 如何使用 ls 的输出打开最后修改的文件?

  • Xargs `-J` 选项

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve