我试图列出每个.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
编辑:添加引号来处理奇怪的文件名