Bash:循环遍历与扩展名不匹配的文件

oni*_*arf 3 regex bash loops file

我正在编写一个bash脚本,需要在目录中循环与特定扩展名不匹配的文件.到目前为止,我发现以下代码循环所有匹配给定扩展名的文件:

for f in *.txt ; do
    echo $f;
done
Run Code Online (Sandbox Code Playgroud)

insthead如何循环遍历与指定扩展名不匹配的文件?

che*_*ner 7

您可以与==操作员进行模式匹配.

for f in *; do
    [[ $f == *.txt ]] && continue
    # [[ $f != *.txt ]] || continue
    ...
done
Run Code Online (Sandbox Code Playgroud)

如果这可能在一个空目录中运行,可以shopt -s nullglob在循环之前使用,也可以放在[ -e "$f" ] || continue循环中.(前者更可取,因为它可以避免不断检查文件是否存在.)

  • @chepner:迟早会发生这种情况. (2认同)

anu*_*ava 5

循环目录中与特定扩展名不匹配的文件

你可以使用extglob:

shopt -s extglob

for f in *.!(txt); do
    echo "$f"
done
Run Code Online (Sandbox Code Playgroud)

pattern *.!(txt)将匹配带点的所有条目,并且不匹配txt点.


编辑:请参阅下面的评论.这是一个find循环遍历当前目录中与特定扩展名不匹配的文件的版本:

while IFS= read -d '' -r f; do
    echo "$f"
done < <(find . -maxdepth 1 -type f -not -name '*.txt' -print0)
Run Code Online (Sandbox Code Playgroud)