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

McL*_*Lan 9 ls

我试图列出每个.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
Run Code Online (Sandbox Code Playgroud)

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

file1.tar.gz 
file2.tar.gz
Run Code Online (Sandbox Code Playgroud)

也不是:

file1.tar.gz file2.tar.gz
Run Code Online (Sandbox Code Playgroud)

这是如何“正确”完成的?

Ste*_*itt 40

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

ls -1 -- *.tar.gz
Run Code Online (Sandbox Code Playgroud)

  • @RonJohn 它避免了以`-` 开头的文件名的意外。 (8认同)
  • 具体来说......假设我是一个攻击者,并且有以下文件:`.hiddenfile`、`benign.php`、`evil.bin`、`--hide=*evil*`; 没有 `--` 你不会看到 `evil.bin` _or_ `--hide=*evil*`。 (5认同)

Jef*_*ler 19

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

printf '%s\n' *.tar.gz
Run Code Online (Sandbox Code Playgroud)

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

设置

$ touch file{1,2}.tar.gz
$ touch file$'\n'3.tar.gz
Run Code Online (Sandbox Code Playgroud)

ls

$ ls -1 -- *.tar.gz
file1.tar.gz
file2.tar.gz
file?3.tar.gz
Run Code Online (Sandbox Code Playgroud)

打印输出

$ printf '%s\n' *.tar.gz
file1.tar.gz
file2.tar.gz
file
3.tar.gz
Run Code Online (Sandbox Code Playgroud)

  • 另见`ls -b`、`ls -Q`、ls `--quoting-style=...`。 (6认同)

J-L*_*J-L 9

ls当它的输出通过管道传输时表现不同。例如:

ls          # outputs filenames in columns
ls | cat    # passes one filename per line to the cat command
Run Code Online (Sandbox Code Playgroud)

因此,如果您想查看所有*.tar.gz文件,每行一个,您可以这样做:

ls *.tar.gz | cat
Run Code Online (Sandbox Code Playgroud)

但是,如果你有什么希望管你的输出?也就是说,有没有办法强制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
Run Code Online (Sandbox Code Playgroud)


Ark*_*zyk 7

或与GNU find

find  -name "*.tar.gz"  -printf '%P\n'
Run Code Online (Sandbox Code Playgroud)

lswith相反,*它将.tar.gz递归搜索文件:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz
Run Code Online (Sandbox Code Playgroud)