Encontre arquivos com letras maiúsculas antes da extensão e letras minúsculas na extensão

4

Eu preciso encontrar arquivos em local remoto (/ mnt /) e alertar se um nome de arquivo corresponde a esses critérios:

  1. O nome do arquivo deve conter apenas letras maiúsculas ou dígitos.

  2. A extensão do arquivo deve conter apenas letras minúsculas.

O caminho negativo também funcionará.

exemplo:

se o nome do arquivo contiver letras minúsculas e / ou a extensão contiver letras maiúsculas

then- echo alert

    
por yarone 06.11.2017 / 13:35

3 respostas

6

Use find para pesquisar arquivos:

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

Isso realiza a pesquisa no diretório atual ( . ), passando também por subdiretórios de maneira recursiva.

  • [.*/] cobre o caminho do arquivo
  • [A-Z0-9] representa todas as letras de A a Z (incluindo, por exemplo, Å como mencionado por @vidarlo) e todos os dígitos de 0 a 9
  • + corresponde ao caractere ou expressão precedente uma ou várias vezes
  • \. é um ponto literal
  • [a-z] significa todas as letras de a a z

Para alguns caracteres especiais, pode ser necessário usar, por exemplo, [[:upper:]] em vez disso:

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

Pergunta editada

Para combinar os testes de find , há -a e -o . Para seu exemplo, isso pode ajudar:

find /mnt/ \( -name "*[a-z]*.*" -o -name "*.*[A-Z]*" \) -exec echo {} +
    
por dessert 06.11.2017 / 13:42
4

Apenas com o 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

Consulte Correspondência de padrões no manual do bash.

    
por glenn jackman 06.11.2017 / 16:09
3

Comando find usando um shellscript

Tente se o método a seguir com um comando find e um shellscript funcionar. Você pode modificar

  • a linha de comando find e
  • o shellscript (por exemplo, a saída)

para ajustar exatamente o que você quer.

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

onde checker contém

#!/bin/bash

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

inversvid="
chmod ugo+x checker
33[7m" redback="
find -type f -exec ./checker {} \; | sort
33[1;37;41m" resetvid="
#!/bin/bash

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

inversvid="
chmod ugo+x checker
33[7m" redback="%pre%33[1;37;41m" resetvid="%pre%33[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
33[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

Eu fiz checker executável e chamo-a localmente. Você pode preferir colocá-lo em ~/bin , que o coloca em PATH , para que você possa chamá-lo com checker .

%pre%

Teste

    
por sudodus 06.11.2017 / 14:32