测试文件是否以某些字母开头并且除了 shell 脚本中文件扩展名末尾的句点之外不包含任何特殊字符

测试文件是否以某些字母开头并且除了 shell 脚本中文件扩展名末尾的句点之外不包含任何特殊字符

我有一个 shell 脚本,它运行 for 循环来对文件夹中的多个文本文件执行命令。我想测试这些文件的名称是否以一组特定的字母(例如 NA)开头,并且文件中没有特殊字符(除了文件扩展名之前没有句点,例如“-”、“_”)。我知道如何测试文件的全名,但我不知道如何测试文件的一部分是否包含这些字符,也不知道如何指定仅包含字母和数字,但不包含除“.”之外的特殊字符。在“.txt”中。我该如何执行此操作,以便命令仅在满足这些要求的文件上执行?我知道它会使用 if 语句,但除此之外我不确定。似乎是使用通配符或正则表达式的情况。

答案1

下面的代码将允许您对以“NA”开头、仅包含字母数字字符、以“.txt”结尾的文本文件执行某些操作。

for f in /path/to/your/folder/*; do 
   if [[ ${f##*/} =~ NA[a-zA-Z0-9]*.txt ]]; then
      # perform some action on $f
   fi
done

如果您想让文件以“N”或“A”开头,请使用以下命令:

for f in /path/to/your/folder/*; do 
    if [[ ${f##*/} =~ [N,A][a-zA-Z0-9]*.txt ]]; then
       # perform some action on $f
    fi
done

答案2

这是一个快速破解:

#!/bin/bash
for i in *;
do
  if [ $(echo $i|cut -c 1-2) == "NA" ];
    then
    EXECUTE_COMMAND
  fi
done

我理解你的问题正确吗?

答案3

如果您的 shell 支持,您可以使用扩展的通配符,例如

巴什:

shopt -s extglob
for f in  NA*([[:alnum:]]).txt; do something; done

桀骜:

setopt extendedglob
for f in  NA([[:alnum:]])#.txt; do something; done

其中*(...)和 分别(...)#表示零次或多次出现。

答案4

egrep 应该做:

egrep 'NA[A-Z a-z 0-9]*\..{3,4}$'

所以ls /path/to/dir | egrep 'NA[A-Z a-z 0-9]*\..{3,4}$'会列出:

NAfoo.txt
NAbar1.jpeg
NA123baz.txt

但会排除:

aiNA1foo.txt
NA2foo_bar.jpeg
NAbar.baz.txt

等等。

相关内容