告诉 `ls` 只打印基本文件名

Sri*_*mar 26 linux unix command-line ls

这是默认行为 ls

ls /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86/pool/v/vi/virtualenv-1.4.4_linux-x86_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86_64/pool/v/vi/virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/macosx/pool/v/vi/virtualenv-1.4.4_macosx_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/win32-x86/pool/v/vi/virtualenv-1.4.4_win32-x86_2.6_1.pypm
Run Code Online (Sandbox Code Playgroud)

如何ls仅打印基本名称?喜欢:

ls $OPTIONS /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
virtualenv-1.4.4_linux-x86_2.6_1.pypm
virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
virtualenv-1.4.4_macosx_2.6_1.pypm
virtualenv-1.4.4_win32-x86_2.6_1.pypm
Run Code Online (Sandbox Code Playgroud)

注意:我更喜欢使用 shell globbing,find因为 /net/nas/data/languages/pypm/sites/rex/free 包含大量文件和目录。

Ste*_*lly 23

虽然xargs -0旨在用于由 \0 分隔的输入(如find -print0),ls但没有这样的选项来以这种方式分隔其输出。

然而,

ls -1 /path/glob | tr '\n' '\0' | xargs -0 -n 1 basename
Run Code Online (Sandbox Code Playgroud)

会在此过程中将换行符转换为空值。然后,这允许 xargs 处理带有空格的名称。

编辑:添加-n 1到 xargs


小智 14

我用这个:

ls | tr '\n' '\n'
Run Code Online (Sandbox Code Playgroud)

它给出了一个列表,如:

file1.mp3
file2.mp3
file3.mp3
...
Run Code Online (Sandbox Code Playgroud)

  • 这本质上与 `ls -1`(并禁用着色)相同,因为 `ls` 表示不写入终端时的那些。看起来您有点忽略了这一点,因为问题是在使用通配符指定 `ls` 路径参数时剥离目录名称。试试 `ls -d "$PWD/"* | tr '\n' '\n'` 看看实际问题是什么。 (4认同)
  • -1 – 不知道为什么人们一直赞成这个答案。正如 Daniel Beck 指出的,它不仅与 `ls -1` 做同样的事情,而且在使用 glob 时它也不起作用。 (3认同)

小智 10

GNU 基本名称FreeBSD 基本名称都接受一个-a参数,允许您将多个路径传递给命令。这对于 shell 通配符非常有效。

basename -a /path/glob*
Run Code Online (Sandbox Code Playgroud)