只显示文件名而不是整个目录路径

104

ls /home/user/new/*.txt 可以打印出该目录下的所有 txt 文件。但是它会按照以下方式输出:

[me@comp]$ ls /home/user/new/*.txt
/home/user/new/file1.txt    /home/user/new/file2.txt    /home/user/new/file3.txt

等等。

我想要运行ls命令,但不想从/home/user/new/目录中运行,因此我必须提供完整的目录名称,但我只想输出如下:

[me@comp]$ ls /home/user/new/*.txt
file1.txt    file2.txt    file3.txt 

我不需要整个路径,只需要文件名。这个问题必须使用ls命令来解决,因为它的输出是为另一个程序而设计的。


什么操作系统?例如,OS X已经可以满足您的需求了。您确定ls没有被别名化吗? - Sean Owen
14个回答

172

ls whateveryouwant | xargs -n 1 basename

这个命令可以达到你的目标吗?

如果不能,你可以使用(cd /the/directory && ls)命令(是的,括号是必需的)。


4
如果whateveryouwant指向多个目录,你应该使用 ls -d - Craig McQueen
13
注意,如果路径中包含空格,xargs会在它们处出现问题。你需要使用 xargs -d '\n' -n 1 来代替。 - Zitrax
在Cygwin上这个非常慢。 - Jagger
“xargs” 的解决方案看起来更整洁,但我发现它非常慢。我选择了 “cd” 解决方案,它运行顺畅。 - Kar.ma
在我的情况下,使用xargs是更好的解决方案,因为我在执行ls时给出了整个路径,所以ls -1在我的情况下无法工作。 - Vishrant

65

不需要使用Xargs之类的工具,仅使用ls命令就足够了。

ls -1 *.txt

逐行显示


35
仔细阅读原帖,这并不正确。只有在该目录下才能起作用。 - Barney Szabolcs
3
完美运行!谢谢 @VRVigneshwara!ls -1 bin/ 在Linux Debian上列出bin/目录中不带路径的条目。 - Zeke Fast
这将会在许多(很多)以.txt结尾的文件和目录中引起麻烦,并且需要在您的shell中启用globbing。 - ckujau

18

你可以有几种方法实现这个目标,其中一种可能是:

for filepath in /path/to/dir/*
do
    filename=$(basename $filepath)

    ... whatever you want to do with the file here
done

17

使用 basename 命令:

basename /home/user/new/*.txt

basename(GNU coreutils)9.3(打包为Arch Linux)不支持不带“-a”选项的多个文件参数。我认为这也适用于大多数(?)其他版本和发行版。 - Sparr

10

(cd dir && ls)

这个命令会在 dir 目录下列出所有文件名。如果你想每行列出一个文件名,请使用 ls -1 命令。

(根据Sactiw的评论,将 ; 更改为 && )。


1
在这种情况下,使用“;”代替“&&”来链接命令将会出现错误,因为它会在不存在“dir”的情况下返回一些输出,即从执行此命令的当前工作目录列出文件。例如,(cd fake_dir; ls)将从当前目录列出文件,即使不存在这样的fake_dir,这将是不正确的。 - sactiw

9
你可以在命令行中添加一个sed脚本:

你可以在命令行中添加一个sed脚本:

ls /home/user/new/*.txt | sed -r 's/^.+\///'

这正是我所需要的!我一直在尝试使用“ls -1 /path/*”命令,但希望路径不被列出。这个方法完美解决了我的问题!我不想通过CD命令改变当前目录,以防需要保持在当前目录中。这个方法让我省去了记录路径并在执行上述命令后返回它的麻烦。太棒了! - Dee

8
使用“rev”和“cut”两次是解决这个问题的一种花哨的方法:
find ./ -name "*.txt" | rev | cut -d '/' -f1 | rev

6
所选答案对我来说不起作用,因为我的文件名中有空格、引号和其他奇怪的字符。要为basename引用输入,您应该使用:
ls /path/to/my/directory | xargs -n1 -I{} basename "{}"

无论文件名是什么,这都可以保证正常工作。


3

我更倾向于使用已经由fge回答的基本名称。

另一种方法是:

ls /home/user/new/*.txt|awk -F"/" '{print $NF}'

另一种不太好看的方法是:
ls /home/user/new/*.txt| perl -pe 's/\//\n/g'|tail -1

1

我希望能够帮助那些遇到老问题并且不断出现的人,我总是在这里找到好的技巧。

我的问题是从Datastage 7.5序列中,在文本文件中列出特定目录中所有“*.txt”文件的名称,不包括路径和扩展名。

我们使用的解决方案是:

ls /home/user/new/*.txt | xargs -n 1 basename | cut -d '.' -f1 > name_list.txt

basename也可以为您删除后缀(您将要删除的后缀作为第二个参数指定)。您的命令将变为:ls /home/user/new/*.txt | xargs -n 1 -J % basename % .txt - welch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接