这是问题的扩展:如何限制 ls 打印的文件数量?
附加条件:如何以适合当前终端宽度的列数打印结果 — —ls
默认情况下就是如此。
我知道如何通过head
命令限制文件数量,但我还没有找到如何以与ls
默认方式相同的方式但通过管道处理后按列打印文件的解决方案。
我尝试使用ls -C
管道将标志(来自man ls
:)-C list entries by columns
连接到cat
。但是它的输出与ls
输出不同:
for i in {1..30}; do touch file$i; done; echo '"ls" out:'; ls; echo '"ls -C | cat" out:'; ls -C | cat
"ls" out:
file1 file11 file13 file15 file17 file19 file20 file22 file24 file26 file28 file3 file4 file6 file8
file10 file12 file14 file16 file18 file2 file21 file23 file25 file27 file29 file30 file5 file7 file9
"ls -C | cat" out:
file1 file12 file15 file18 file20 file23 file26 file29 file4 file7
file10 file13 file16 file19 file21 file24 file27 file3 file5 file8
file11 file14 file17 file2 file22 file25 file28 file30 file6 file9
“ls”输出 2 行。而“ls -C | cat”输出 3 行。这可能是ls -C
错误吗?
我尝试了column
命令。但是当存在名称较长的文件时,它给出的结果与 不同ls
。
mv file30 file-with-long-name; ls
file1 file11 file13 file15 file17 file19 file20 file22 file24 file26 file28 file3 file5 file7 file9
file10 file12 file14 file16 file18 file2 file21 file23 file25 file27 file29 file4 file6 file8 file-with-long-name
ls | cat | column -c $(tput cols)
file1 file14 file19 file23 file28 file6
file10 file15 file2 file24 file29 file7
file11 file16 file20 file25 file3 file8
file12 file17 file21 file26 file4 file9
file13 file18 file22 file27 file5 file-with-long-name
ls
给出 2 行。并ls | cat | column -c $(tput cols)
给出 5 行。—
tput cols
计算终端宽度。是否有其他替代方法,column
不会根据最长文件名格式化所有列的宽度,而是像这样做ls
?
是否有其他命令可以ls
实现这种打印并限制最大文件数量?(但我也希望有类似于ls
文件着色的功能。)
对于每个cd
目录,我希望自动显示当前目录的内容。这可以通过放入环境变量来实现ls
。$PROMPT_COMMAND
但是包含太多文件的目录存在问题。它们会在控制台中产生很多噪音/杂乱。我想限制它们以限制ls
输出。
和
zsh
:将列出前 10 个文件(按词汇顺序)。
o
对于按修改时间排序的前 10 个文件m
(使用 GNUls
,您可以替换-t
为-U
以跳过按修改时间排序,因为 zsh 已对它们进行排序)。另请参阅
oL
(使用)按长度(大小)ls -S
排序,(使用 GNU )按数字(类型)排序,而不是恢复顺序(使用)等。用于最后 10 个。L
S
n
ls -v
n
v
O
o
ls -r
[-10,-1]
zsh
的print
内置命令也可以使用其选项按列打印-C
:以
print
r
aw4
C
列为例。它还具有一个
chpwd
钩子函数(和数组) ,chpwd_functions
当当前工作目录发生变化时,它会被调用(比 bash 更灵活,bash$PROMPT_COMMAND
的等价函数是precmd
钩子函数或包装cd
//内置函数),pushd
popd
因此您可以添加到
~/.zshrc
:在
bash
(或者从中复制该语法的ksh93
地方bash
),您可以执行以下操作:然后:
bash
没有 glob 限定符来改变 glob 扩展的顺序,但下一个版本 5.3 将有一个GLOBSORT
全局变量,您可以使用它来更改默认排序顺序,这样您就可以笨拙地完成使用 zsh 的oOn^-
glob 限定符可以执行的部分操作。关于您的
ls -C | cat
错误,只是输出没有到达终端,因此ls
假设 80 列显示宽度而不是请求显示其输出的终端的宽度。-w
您可以使用选项(ls
至少使用 GNU)或环境变量调整默认宽度$COLUMNS
(正如@ChrisDavies所说,bash¹ 像 zsh 一样根据终端的宽度自动设置该变量,但默认情况下不会将其导出到环境中)。ls
输出未到达终端的其他副作用是:head
当文件包含换行符(这些控制字符之一)时,使用是无效的。ls
添加的别名,则不再进行着色。--color=auto
ls
此外,如果您要
head
在列输出上使用,则应使用-x
(又称--format=across
GNUls
)而不是-C
,否则您将无法获得第一个文件。所以:对于分栏输出的前 4 行
ls
。¹ 对于 bash 来说,只有在交互时
shell
bash
(和其他)维护一个名为 的POSIX 变量$COLUMNS
,该变量表示终端设备的当前已知宽度。当您运行命令ls
(例如隐式ls -C
)时,该工具会检查终端的宽度(如果有),并调整文件名的列数以适合可用宽度。如果宽度不可用,则ls
返回到假设标准 80 列宽度输出。当您运行诸如 之类的管道时
ls -C | head -n4
,由于$COLUMNS
变量未导出,因此ls
命令无法使用它。因此ls -C
这里默认为 80 列宽的输出。您可以通过使用
$COLUMNS
以下ls
命令来解决此问题:使用当前设置为 132 个字符宽度的终端设备的示例
请注意,您不能使用来更改裸(或)
$COLUMNS
所呈现的列数。该工具的某些版本倾向于直接向终端设备询问其列宽,并且只有当此方法失败时,它们才会重新使用。ls
ls -C
$COLUMNS