使用 grep 我可以按照以下方式解决此任务:
grep --no-message -l [[:alnum:]] /etc/* | grep [[:digit:]]
获得了类似的结果:
ls -o /etc/ | grep ^- | awk '{print $8}' | grep [[:digit:]]
但我希望以递归方式读取每个目录下的所有文件。这就是我能做的:
grep --no-message -lR [[:alnum:]] /etc/* | grep [[:digit:]]
今天如何解决这项任务?这是正确的方法吗?您可以提供哪些其他解决方案来解决此任务?
答案 0 :(得分:2)
您不应仅仅使用grep
来获取文件名。而不是我认为你想用
grep --no-message -l [[:alnum:]] /etc/*
你可以做到
echo /etc/*
由于目标是列出带有数字的文件,因此可以使用类似:
的globecho /etc/*[[:digit:]]*
如果你想以递归的方式做到这一点,你可以用bash这样做:
shopt -s globstar
echo /etc/**/*[[:digit:]]*
或者您可以使用find
:
find /etc -name '*[[:digit:]]*'
答案 1 :(得分:1)
您可以使用find
:
find /etc -type f -name \*[[:digit:]]\*
请注意,此命令仅列出 names 中带有数字的文件,而不是完整路径。对于后者使用不同的过滤器:
find /etc -type f -path \*[[:digit:]]\*
答案 2 :(得分:0)
grep
的解决方案,请点击此处。
while read -r filepath; do
# grep for digits in the basename so that we choose only those
# files that have a digit in them, not in any parent directory name
if grep -q '[[:digit:]]' <<< "$(basename $filepath)"; then
echo "$filepath"
fi
done < <(find /etc -type f -print)
根本没有效率。
答案 3 :(得分:0)
如果任务是要有一个纯grep
解决方案,那么它就是:
grep -laR . /etc | grep '^.*/[^/]*[[:digit:]][^/]*$'
正则表达式:
^...$
覆盖整行; .*/[^/]*...[^/]*
仅查找文件名。