如何列出* .tar.gz,每行一个文件名?


8

我试图.tar.gz仅使用以下命令列出每个文件:

ls *.tar.gz -l

...它向我显示以下列表:

-rw-rw-r-- 1 osm osm  949 Nov 27 16:17 file1.tar.gz
-rw-rw-r-- 1 osm osm  949 Nov 27 16:17 file2.tar.gz

但是,我只需要这样列出:

file1.tar.gz 
file2.tar.gz

而且不是:

file1.tar.gz file2.tar.gz

如何“适当地”完成?


6
在文件名之前使用选项是一个好习惯。并且您需要使用-1而不是-l
AnonymousLurker

17
ls -1 *.tar.gz但是,您要将列表用作什么?如果您要对这些文件名执行操作,则ls不是正确的方法。请参阅为什么*不*解析`ls`(以及怎么做)?
库沙兰丹

3
您需要的手册是man ls。确保您的显示字体在1(一)和l(小写字母ell)之间具有良好的对比度。
ctrl-alt-delor

Answers:


39

-1选项(数字“ one”,而不是小写的“ L”)将每行列出一个文件,没有其他信息:

ls -1 -- *.tar.gz

1
为什么双破折号?ls -1 *.tar.gz效果也一样。
罗恩·约翰

8
@RonJohn可以避免以开头的文件名带来的意外-
史蒂芬·基特

5
具体来说......说我是攻击者,并且有以下文件:.hiddenfilebenign.phpevil.bin--hide=*evil*,没有--你你不会看到evil.bin --hide=*evil*
wizzwizz4

我对没有-2(或-3等)感到非常失望!;-)
彼得-恢复莫妮卡

1
(...让我抬起头columns!)
彼得-恢复莫妮卡

19

如果只需要文件名,则可以使用printf

printf '%s\n' *.tar.gz

...外壳程序会将*.tar.gz通配符扩展为文件名,然后printf打印它们,并在每个文件名后跟换行符。这个输出会有所不同一点说的ls与嵌入其中的换行符的文件名的情况下:

设定

$ touch file{1,2}.tar.gz
$ touch file$'\n'3.tar.gz

ls

$ ls -1 -- *.tar.gz
file1.tar.gz
file2.tar.gz
file?3.tar.gz

打印

$ printf '%s\n' *.tar.gz
file1.tar.gz
file2.tar.gz
file
3.tar.gz

6
又见ls -bls -Q,LS --quoting-style=...
史蒂芬·基特

printf '%q\n'。(
均为

9

ls通过管道传输其输出时,其行为有所不同。例如:

ls          # outputs filenames in columns
ls | cat    # passes one filename per line to the cat command

因此,如果要查看所有*.tar.gz文件(每行一个),可以执行以下操作:

ls *.tar.gz | cat

但是,如果你有什么希望管你的输出?也就是说,是否有一种方法可以强制ls将文件名一个输出到一行而不用管道输出?

是的,用-1开关。(带数字的破折号为1。)因此,您可以使用以下命令:

ls -1             # shows all (non-hidden) files, one per line
ls -1 *.tar.gz    # shows only *.tar.gz files, one per line

7

或搭配GNU find

find  -name "*.tar.gz"  -printf '%P\n'

与之相反ls*它将以.tar.gz递归方式搜索文件:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz

为什么-printf '%P\n'而不仅仅是-print-在这一点上任何兼容的Posix find都可以使用。
马丁·邦纳

@MartinBonner,因为-print它将添加./在文件名之前。
Arkadiusz Drabczyk '18

4

一个稍微迂回和糊涂方式:

for i in *.tar.gz; do
    echo "$i"
done

编辑:添加引号来处理奇怪的文件名


5
touch -- '-e \a.tar.gz'出于引用变量和unix.stackexchange.com/q/65803/117549的原因(出于使用printf而不是echo的原因)
Jeff Schaller

我只花了5分钟的时间试图弄清楚如何删除生成的-e \a.tar.gz文件
抓取

3
抱歉!rm -- '-e \a.tar.gz'应该可以解决问题
Jeff Schaller

你很棒,这是一个教训,我学会的是--作品rm和很多其他的。
抓取

@JeffSchaller:本地名称的另一个解决方案是rm_etc './-x blah'
dave_thompson_085 '18
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.