我试图列出每个.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)
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 -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当它的输出通过管道传输时表现不同。例如:
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)
或与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)