Ubuntu awk - 打印包含除数字之外的任何内容的文件名

时间:2016-05-25 06:17:22

标签: bash awk

我希望打印所有不“仅包含数字”的文件名:

到目前为止,这是我的代码:

find . -type f | awk '!/[[:digit:]]/ {print}'

这会找到每个不包含任何数字的文件。

我的问题还在于,它也会检查目录名称。

最新代码:

find . -type f | awk '/.*\W.*/ {print}'

我认为它有效,但它也检查目录名称,我只关心文件

4 个答案:

答案 0 :(得分:4)

如果我理解正确的话:

打印所有不包含"仅包含数字的文件名":

find . -type f -printf '%f\n'| awk '/[^[:digit:]]/ {print}'

没有包含目录。

如果您希望所有不包含数字或字母的文件名":

find . -type f -printf '%f\n'| awk '/[^[:alnum:]]/ {print}'

但我相信包含点.和空格是明智之举 通常在文件名中使用的字符:

find . -type f -printf '%f\n'| awk '/[^[:alnum:]. ]/ {print}'

(已取消)Shorthand Character Class \W还将包含_下划线,并且不太便于移植(是GNU扩展)。

我不知道你是否要包括那个。

答案 1 :(得分:3)

更简单的解决方案是

find . -type f -regextype sed -not -regex '^[./[:digit:]]\+$'

此处-not -regex相当于sed。{/ p>中的!p

如果您正在处理非标准文件名,请执行以下操作:

find . -type f -regextype sed \
       -not -regex '^[./[:digit:]]\+$' \
       -print0 |  while read -r -d '' line
do 
  echo "$line"
done

示例输出

./binaryzebra8
./foo
./bingo bar
./bar
./file
./romeo
juliet --> non-standard file name
./888/bingo88
./\hash --> non-standard file name

@ BinaryZebra的答案中提到的-printf "%f\n"为您提供了[ manpage ]所说的文件的基本名称:

  

%f删除了任何前导目录的文件名(仅限最后一个   元素)。

但实际上,如果您确实正在处理find的结果,则需要完整的文件路径。

答案 2 :(得分:0)

仅仅依靠find

find . -type f -name '*[^0-9]*'

答案 3 :(得分:0)

另一种可能性,就是我不会使用awk,因为就简单的grep -v

而言,更难以否定搜索模式
find . -type f | grep -v '^[0-9]*$'