Найдите файлы с прописными буквами перед дополнительными и строчными буквами в расширении

Я должен найти файлы в удаленном месте (/mnt/) и предупреждение, если имя файла соответствует этим критериям:

  1. Имя файла должно содержать только прописные буквы или цифры.

  2. Расширение файла должно содержать только строчные буквы.

Отрицательный путь также будет работать.

пример:

если-имя-файла содержит строчные буквы, и/или расширение содержит прописные буквы

предупреждение эха тогдашнее

4
задан 6 November 2017 в 09:10

3 ответа

Использовать 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 {} +
6
ответ дан 23 November 2019 в 11:39

Только с ударом:

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

Посмотрите Сопоставление с образцом в руководстве удара.

4
ответ дан 23 November 2019 в 11:39

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

Тест

enter image description here

3
ответ дан 23 November 2019 в 11:39

Другие вопросы по тегам:

Похожие вопросы: