Bash ls (glob-style)

5

我有一个练习,需要打印出当前文件夹中包含字母[a-k][m-p]以及[1-9]中至少一次的所有文件名。我可能需要使用ls(glob样式)。


我会使用 grep 和正则表达式:ls -1 | grep -E "your_regex" - Blender
好的,我不知道正则表达式是什么,而且我认为我必须使用ls..谢谢。 - user1923376
哎?我必须使用 ls [glob-style]? - user1923376
这可能会对你有所帮助 http://stackoverflow.com/q/14004201/722238 - fbynite
这个问题最初是我的... xD,但不,那并没有帮助。现在我正在使用egrep解决这个问题,但不确定如何编写正则表达式以确保字符串至少包含1次[a-k] [m-p] [1-9]。 - user1923376
1
不要解析 ls。 - dogbane
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

注意:如果你只想查看文件而非目录,可以在内部使用find命令。
find . -maxdepth 1 -type f | grep "[a-k]" | grep "[m-p]" | grep "[1-9]"

2
一个纯粹的 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]

希望这可以帮助!


0
如果顺序不重要,且字母出现一次或多次,您可以使用链式 grep。
ls | egrep "[a-k]" | egrep "[m-p]" | egrep "[1-9]"

如果顺序很重要,那么只需使用全局模式。
ls *[a-k]*[m-p]*[1-9]*

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]*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接