告诉ls只打印基本文件名


21

这是默认行为 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

如何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

注意find与/ net / nas / data / languages / pypm / sites / rex / free包含大量文件和目录相比,我更喜欢使用shell globing。


1
当目录包含许多文件时,您更喜欢使用find进行shell遍历?错字?
akira 2010年

1
我猜想OP不想列出子目录,并且不知道传递-maxdepth 1给的选项find
直觉

Answers:


19

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

然而,

ls -1 /path/glob | tr '\n' '\0' | xargs -0 -n 1 basename

会在整个过程中将换行符转换为null的技巧。然后,这允许xargs使用具有空格的名称。

编辑:添加-n 1到xargs


这对我不起作用:basename: extra operand \ 033 [0m / net / nas / data / languages / pypm / sites / rex / free / 2.6 / macosx / pool / v / vi / virtualenv-1.4.4_macosx_2.6_1.pypm \ 033 [ 0m'`
Srid说Monica恢复“ 2010年

@Sridhar:您可能需要在-n 1其他地方建议您使用xargs?(答复已编辑)
史蒂夫·弗利

尽管我个人更喜欢自己的答案(因为我几乎永远不必处理文件名中的空格),但我会将此标记为答案,因为它也可以处理空格。
斯里德(Srid)说恢复莫妮卡(Monica)2010年

如果Mac版本的xargs支持-d(定界符)选项,则可以执行ls ... | xargs -d '\n' -n 1 basename
直觉

12

我用这个:

ls | tr '\n' '\n'

它给出的列表如下:

file1.mp3
file2.mp3
file3.mp3
...

3
这本质上与ls -1(和禁止着色)相同,这ls意味着不写入终端时的含义。看起来您似乎遗漏了一点,因为当ls使用通配符指定路径参数时,问题是剥离目录名称。尝试ls -d "$PWD/"* | tr '\n' '\n'看看实际的问题是什么。
丹尼尔·贝克

-1 –不知道为什么人们会继续支持这个答案。ls -1正如Daniel Beck指出的那样,它不仅与做相同的事情,而且在使用glob时也不起作用。
slhck

-1-与相同ls -1,仅适用于当前目录,而不能使用路径ls path/*
布伦丹·伯德


4

awk 解:

ls -1 /path/glob | awk -F'/' '{print $NF}'



1

您说过您喜欢遍历世界find,但是您知道两者并不互斥吗?通配发生在您运行的任何命令上,而不仅仅是ls。例如:

$ export BASE=/net/nas/data/languages/pypm/sites/rex/free/2.6

$ echo $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ ls $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -print0 | xargs -0 basename

注意,查找示例可以使用-print0,如果您的路径包含空格(在tr其他地方提到的基于-base的解决方案在普通空格上很有效,但在包含实际换行符的文件上则无效),该示例就很方便。

最后,如果您有权访问GNU find,则还可以使用-printf,它完全避免了基名调用:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'

不幸的是,该-printf选项在MacOSX版本的中不可用find
斯里德(Srid)说恢复莫妮卡(Monica)2010年

好决定; 为监督表示歉意。我已经更新了答案。
Ryan Bright,2010年

-3

转到拥有所有文件并键入的目录。

find *.pypm

1
OP明确声明他不想使用find
gronostaj 2014年

1
另外,这甚至不能满足OP的需求。(注意:find . -name '*pypm'如果有的话,您应该使用……仅将glob放在find之外一无所获–那么您就可以编写ls *.pypm。)
slhck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.