Linux下显示目录中有多少个以两位数结尾的文件名的命令是什么?使用ls
这样的命令:
ls -l | wc –l *[0-9][0-9]
答案1
在 Bash 中,以下操作是非递归的。你当然可以将它放在一个函数中:
shopt -q nullglob || restore=1 && shopt -s nullglob
var=(*[0-9][0-9])
echo ${#var[@]}
[ 1 -eq "$restore" ] && shopt -u nullglob
即使你有疯狂的文件名,这也有效。如果你的文件名不疯狂,那么你可以使用这种ls
方法:
ls -d1b *[0-9][0-9] | wc -l
请注意,我以前使用的标志ls
是不同的:-d
将列出目录,而不是其内容(如果您有一个名为something00
例如的目录);-1
表示使用单列进行输出;-b
转义文件名,这将使大多数疯狂的文件名起作用。
something00
这两个都将包括计数中指定的目录。如果您只需要文件或递归,find
那就是您所寻找的。这将递归地搜索当前目录 ( .
),仅查找文件 ( -type f
):
find . -type f -name '*[0-9][0-9]' -printf 'f\n' | wc -l
请注意使用-printf
, 只打印字母f
而不是文件名。您只想对它们进行计数,这样就可以免受疯狂的文件名的影响。
答案2
如果不需要wc -l
,您可以使用tree
如下命令。
tree -P "*[0-9][0-9]" foldername/
测试
在我的一个文件夹中,我创建了 3 个以两位数结尾的文件。
首先,我发出 ls 来查看所有文件。
bash-3.2$ ls
1aga21 abcd kshexp.ksh new.txt temp temp1 temp12 temp2 temp3 temp34
现在,我向上一层文件夹使用树命令。
之后,我发出tree
如下命令。
bash-3.2$ tree -P "*[0-9][0-9]" jun4th/
jun4th/
|-- 1aga21
|-- temp12
`-- temp34
0 directories, 3 files
正如您所看到的,最后一行列出了符合我们条件的文件总数。这-P命令标志tree
是指定模式。
编辑
正如 derobert 指出的那样,如果存在以 2 个数字结尾的目录,并且该目录又包含以 2 个数字结尾的多个文件,则 tree 命令将生成所有文件并导致更嘈杂的输出。我们可以通过将原始命令调整为如下所示来防止这种情况。
tree -P "*[0-9][0-9]" -L 1 jun4th/
请注意该标志-L 1
,这意味着仅在当前目录下的一个子级别中查找文件。
答案3
如果你不介意 Perl:
perl -E '@a=<*[0-9][0-9]>;say scalar @a'
请注意,这(与迄今为止提出的所有其他解决方案一样)假设您要计算名称以两个结尾的文件或者更多数字。该文件foo123
也将被计数。
如果这不是你想要的,下面的 Perl 将打印所有的计数文件(与文件和目录相反)其名称以两位数字结尾:
perl -E 'say scalar grep { -f && /[^0-9][0-9]{2}\z/ } <*>'
答案4
这是一种可移植的方法find
:
find ././ ! -type d -name '*[0-9][0-9]' | grep -c '^\./\./'
以及外壳函数:
set -- ./*[0-9][0-9]
for f do
[ -e "$f" ] && echo
done | wc -l
要递归且可移植地对ls
文件名末尾仅包含 2 位数字的文件进行计数和匹配,请执行以下操作:
ls ./ -aR1iqp |
grep -c '^ *[0-9].*[^0-9][0-9][0-9]$'
要仅搜索当前目录,请执行以下操作:
ls ./.* ./* -ad1iqp |
grep -c '^ *[0-9].*[^0-9][0-9][0-9]$'