我有一个 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
等等。