我需要在远程位置(/mnt/)中查找文件,并在文件名符合以下条件时发出警报:
文件名只能包含大写字母或数字。
文件扩展名必须仅包含小写字母。
消极的方式同样可行。
例子:
如果文件名包含小写字母和/或扩展名包含大写字母
然后-回声警报
答案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