查找扩展名前有大写字母且扩展名中有小写字母的文件

查找扩展名前有大写字母且扩展名中有小写字母的文件

我需要在远程位置(/mnt/)中查找文件,并在文件名符合以下条件时发出警报:

  1. 文件名只能包含大写字母或数字。

  2. 文件扩展名必须仅包含小写字母。

消极的方式同样可行。

例子:

如果文件名包含小写字母和/或扩展名包含大写字母

然后-回声警报

答案1

用于find搜索文件:

find . -regex ".*/[A-Z0-9]+\.[a-z]+"

这将在当前目录()中执行搜索.,并递归遍历子目录。

  • [.*/]覆盖文件路径
  • [A-Z0-9]代表从 A 到 Z 的每个字母(包括@vidarlo 提到的 Å)和0 至 9 的每个数字
  • +匹配前面的字符或表达式一次或多次
  • \.是一个文字点
  • [a-z]代表从 a 到 z 的每个字母

对于某些特殊字符,可能需要使用例如[[:upper:]]

find . -regextype egrep -regex ".*/[[:upper:][:digit:]]+\.[[:lower:]]+"

已编辑问题

要结合find的测试有-a-o,对于您的示例,这可能会有所帮助:

find /mnt/ \( -name "*[a-z]*.*" -o -name "*.*[A-Z]*" \) -exec echo {} +

答案2

只需使用 bash:

shopt -s extglob nullglob

cd /mnt

# just print the "good" files
printf "%s\n" +([[:upper:][:digit:]]).+([[:lower:]])

# or, report on all files
for f in *; do
    if [[ $f == +([[:upper:][:digit:]]).+([[:lower:]]) ]]; then
        echo "OK: $f"
    else
        echo "**: $f"
    fi
done

模式匹配在 bash 手册中。

答案3

find使用 shellscript 命令

尝试使用 find 命令和 shellscript 的以下方法是否有效。您可以修改

  • 命令find行和
  • shell脚本(例如输出)

完全符合您的要求。

find -type f -exec ./checker {} \; | sort

其中checker包含

#!/bin/bash

if [ $# -ne 1 ]
then
 echo "Usage: $0 <filename>"
 echo "Enter the file name as a parameter"
 exit
fi

inversvid="\0033[7m"
redback="\0033[1;37;41m"
resetvid="\0033[0m"

filnam=${1##*/}
name=${filnam%\.*}
upnam=${name^^}
ext=${filnam##*.}
loex=${ext,,}

if [ "${filnam^^}" == "$upnam" ]
then
 corrfile=$upnam
else
 corrfile="$upnam.$loex"
fi

if [ "$corrfile" == "$filnam" ]
then
 echo -e " good match: '$filnam'"
else
 echo -e "$redback bad match:  '$filnam' does not match '$corrfile' $resetvid"
fi

我制作了checker可执行文件并在本地调用它。您可能更喜欢将其放入~/bin,这样就可以将其带入 ,PATH以便您可以使用 调用它checker

chmod ugo+x checker

测试

在此处输入图片描述

相关内容