我有一个练习,我必须打印当前文件夹中包含的所有文件名,其中包含一个字母[a-k]
,[m-p]
并且[1-9]
至少 1 次(每个)。我可能不得不使用ls
(glob-style)。
问问题
8563 次
4 回答
3
如果顺序很重要,那么您可以使用通配符:
$ ls *[a-k]*[m-p]*[1-9]*
ajunk404 am1 cn5
否则仅grep
针对每个组:
ls | grep "[a-k]" | grep "[m-p]" | grep "[1-9]"
1ma
ajunk404
am1
cn5
m1a
注意:ls
如果您真的只想find
在里面使用文件,将显示目录:
find . -maxdepth 1 -type f | grep "[a-k]" | grep "[m-p]" | grep "[1-9]"
于 2012-12-28T13:00:26.907 回答
1
100% 纯 bash(而且很有趣!)的可能性:
#!/bin/bash
shopt -s nullglob
a=( *[a-k]* )
b=(); for i in "${a[@]}"; do [[ "$i" = *[p-z]* ]] && b+=( "$i" ); done
c=(); for i in "${b[@]}"; do [[ "$i" = *[1-9]* ]] && c+=( "$i" ); done
printf "%s\n" "${c[@]}"
没有任何外部过程!没有管道!只有纯粹的 bash!对于名称中带有有趣符号(例如,换行符)的文件,100% 安全(其他使用 . 的方法并非如此ls
)。如果您想真正看到文件名中的有趣符号并正确引用它们,以便重用输出,请使用
printf "%q\n" "${c[@]}"
代替最后一条printf
语句。
笔记。模式[a-k]
,[p-z]
是依赖于语言环境的。您可能需要设置LC_ALL=C
以确保它[a-k]
真正意味着[abcdefghijk]
而不是其他东西,例如,[aAbBcCdDeEfFgGhHiIjJk]
.
希望这可以帮助!
于 2012-12-28T13:20:03.110 回答
0
要完整,您需要搜索所有组合:
ls *[a-k]*[m-p]*[1-9]* *[a-k]*[1-9]*[m-p]* \
*[m-p]*[a-k]*[1-9]* *[m-p]*[1-9]*[a-k]* \
*[1-9]*[m-p]*[a-k]* *[1-9]*[a-k]*[m-p]*
于 2012-12-28T17:13:31.880 回答
0
如果顺序不重要,并且字母出现一次或多次,则可以使用链式 grep。
ls | egrep "[a-k]" | egrep "[m-p]" | egrep "[1-9]"
如果顺序很重要,那么只需使用 glob 模式
ls *[a-k]*[m-p]*[1-9]*
于 2012-12-28T13:04:44.353 回答