![输出与字符串匹配的文件列表](https://linux22.com/image/213489/%E8%BE%93%E5%87%BA%E4%B8%8E%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D%E7%9A%84%E6%96%87%E4%BB%B6%E5%88%97%E8%A1%A8.png)
我正在尝试编写一个脚本,该脚本将在目录中搜索特定的 .deb 文件以安装并输出该目录中可用 .deb 文件的编号列表。
前任。在根文件夹中搜索包含“install.deb”的所有文件名,并将它们输出到列表 ex 中。 1. newinstall.deb 2. oldinstall.deb 3. install.deb 等。
答案1
find
可用于查找名称以.deb
and结尾的常规文件awk
(mawk
或gawk
至少是在 Ubuntu 系统上找到的实现awk
)可用于进行编号和格式化。我们可以调用 来sort
获取排序列表。与文件路径一样,我们使用 NUL 分隔的记录作为交换格式,因为换行符与文件路径中的任何字符一样有效,因此使用-print0
, -z
(GNU 扩展)和RS='\0'
:
LC_ALL=C find -H "$root_folder" -name '*.deb' -type f -print0 |
sort -z |
awk -v RS='\0' '{printf "%3d. %s\n", NR, $0}'
awk
您可以使用which来代替,perl
从而使其可移植到awk
不支持 NUL 作为记录分隔符的系统:
perl -0lne 'printf "%3d. %s\n", $., $_'
要排除隐藏的,请在-name '.?*' -prune -o
后面插入"$root_folder"
.如果您使用 zsh shell,另一种方法是使用其默认排序并排除隐藏文件的 glob,并且find
当文件名在语言环境中不是有效文本时不会出现与 GNU 相同的问题:
n=0
for f ( $root_folder/**/*.deb(N.) ) printf '%3d. %s\n' ++n $f
与 相反,如果以或 为/ ...开头find
,它也不会中断。$root_folder
-
!
(