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


74

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已经完成了您想要的工作。您确定l没有别名吗?
肖恩·欧文

Answers:


127

ls whateveryouwant | xargs -n 1 basename

那对你有用吗?

否则,您可以(cd /the/directory && ls)(是的,要加上括号)


3
您可能应该使用ls -d万一whateveryouwant引用多个目录。
Craig McQueen

8
请注意,如果路径包含空格,则xargs将在其上中断。您需要xargs -d '\n' -n 1改用。
Zitrax

在Cygwin上,这太慢了。
Jagger

xargs解决方案看起来更整洁,但我发现它很慢。我选择了cd可以顺畅运行的解决方案。
卡马

xargs在我的情况下更好的解决方案,因为我给的完整路径,而这样做ls所以ls -1并没有我的情况下工作
Vishrant

44

不需要Xargs和all,ls绰绰有余。

ls -1 *.txt

按行显示


22
如果您仔细阅读OP,这是不正确的。仅当您在该目录中时,此方法才有效。
巴尼·萨博奇

2
完美的作品!感谢@VRVigneshwara!ls -1 bin/列出bin /目录中的条目,在Linux Debian上没有路径。
Zeke Fast

这将导致有许多(和许多)文件,并还在结尾目录的麻烦.txt,并需要通配符在你的壳层活性。
ckujau

14

有几种方法可以实现此目的。一个会是这样的:

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

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

9

(cd dir && ls)

只输出dir中的文件名。采用ls -1如果您希望每行一个,。

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


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


6

您可以在命令行中添加sed脚本:

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

6

一种解决此问题的奇特方法是使用两次“ rev”和“ cut”:

find ./ -name "*.txt" | rev | cut -d '/' -f1 | rev

3

我更喜欢fge已经回答过的基本名称。另一种方法是:

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

另一种丑陋的方式是:

ls /home/user/new/*.txt| perl -pe 's/\//\n/g'|tail -1

2

所选答案对我不起作用,因为我的文件名中包含空格,引号和其他奇怪的字符。要引用的输入basename,应使用:

ls /path/to/my/directory | xargs -n1 -I{} basename "{}"

无论调用什么文件,都可以保证此方法有效。


0

只是希望能对某人有所帮助,因为老问题似乎不时地出现,我总是在这里找到好的建议。

我的问题是在文本文件中列出某个目录中所有“ * .txt”文件的名称,这些名称没有路径,也没有Datastage 7.5序列的扩展名。

我们使用的解决方案是:

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

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.