Я должен найти файлы в удаленном месте (/mnt/) и предупреждение, если имя файла соответствует этим критериям:
Имя файла должно содержать только прописные буквы или цифры.
Расширение файла должно содержать только строчные буквы.
Отрицательный путь также будет работать.
пример:
если-имя-файла содержит строчные буквы, и/или расширение содержит прописные буквы
предупреждение эха тогдашнее
Использовать find
искать файлы:
find . -regex ".*/[A-Z0-9]+\.[a-z]+"
Это выполняет поиск в текущем каталоге (.
), рекурсивно прохождение через подкаталогов также.
[.*/]
покрывает путь к файлу[A-Z0-9]
обозначает каждую букву от А до Я (включая, например, Å, как упомянуто @vidarlo) и каждая цифра от 0 до 9+
соответствует предшествующему символу или выражению один или многократно\.
литеральная точка[a-z]
обозначает каждую букву от до zДля некоторых специальных символов могло бы быть необходимо использовать, например. [[:upper:]]
вместо этого:
find . -regextype egrep -regex ".*/[[:upper:][:digit:]]+\.[[:lower:]]+"
Объединиться find
тесты там -a
и -o
, для Вашего примера это могло помочь:
find /mnt/ \( -name "*[a-z]*.*" -o -name "*.*[A-Z]*" \) -exec echo {} +
Только с ударом:
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
Посмотрите Сопоставление с образцом в руководстве удара.
find
команда с помощью сценария оболочкиПопробуйте, если следующий метод с командой находки и сценарий оболочки работают. Можно изменить
find
командная строка исоответствовать точно, что Вы хотите.
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