我有一个练习,需要打印出当前文件夹中包含字母[a-k]
和[m-p]
以及[1-9]
中至少一次的所有文件名。我可能需要使用ls
(glob样式)。
如果顺序很重要,那么你可以使用通配符:
$ 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
find
命令。find . -maxdepth 1 -type f | grep "[a-k]" | grep "[m-p]" | grep "[1-9]"
#!/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]
。
希望这可以帮助!
ls | egrep "[a-k]" | egrep "[m-p]" | egrep "[1-9]"
ls *[a-k]*[m-p]*[1-9]*
要完整,你需要搜索所有的组合:
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]*
grep
和正则表达式:ls -1 | grep -E "your_regex"
。 - Blender