设置

设置

我试图列出每个.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

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

答案1

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

ls -1 -- *.tar.gz

答案2

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

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

... shell 会将*.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

答案3

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

答案4

稍微迂回一点疯狂的方式:

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

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

相关内容