Script de shell para verificar a presença de um ou mais arquivos com uma extensão específica?

3

Eu quero escrever um script para encontrar um arquivo com uma extensão específica.isso eu já fiz:

#!/bin/bash
file="/home/Savio/Dsktop/check/*.csv"
file1="/home/Savio/check/*.txt"
if [[ -f "$file" && -f "$file1" ]];
then
    echo " found."
else
    echo "not found."
fi

Onde a pasta check contém subpastas. Por favor, corrija-me se houver algo de errado

    
por Savio Mathew 20.08.2013 / 17:18

5 respostas

1

Se você não quiser recursão, pode fazer

export DIR=/home/Savio/Dsktop/check
if ls ${DIR}/*.txt &>/dev/null && ls ${DIR}/*.csv &>/dev/null
then
    echo "Found."
else
    echo "Not found."
fi

Ou, em perl :

perl -e '
    $DIR="/home/Savio/Dsktop/check";
    @a= glob "${DIR}/*.txt";
    @b= glob "${DIR}/*.csv"; 
    print  @a && @b ? "Found.\n" : "Not found.\n"
' 

Se você fizer desejar recursão, a solução proposta nas outras respostas funcionará. Você pode aumentar a velocidade fazendo find parar após a primeira correspondência:

export DIR=/home/Savio/Dsktop/check
CSV=$(find "$DIR" -name *.csv|head -n1)
TXT=$(find "$DIR" -name *.txt|head -n1)
[ ! -z "$CSV" ] && [ ! -z "$TXT" ] && echo Found || echo Not found

Referências

por 20.08.2013 / 19:07
2

O curinga em file1 nunca é expandido porque está sempre entre aspas.

No bash, uma maneira é definir a nullglob option para que um curinga que não corresponda a nenhum arquivo seja expandido para uma lista vazia.

#!/bin/bash
shopt -s nullglob
csv_files=(/home/Savio/Dsktop/check/*.csv)
txt_files=(/home/Savio/check/*.txt)
if ((${#csv_files[@]} && ${#txt_files[@]}))
then
  echo " found."
else
  echo "not found."
fi

Se você quiser também corresponder aos arquivos de pontos, defina a opção dotglob .

Com apenas um shell POSIX, você precisa lidar com o padrão permanecendo inalterado se não houver correspondência.

matches_exist () {
  [ $# -gt 1 ] || [ -e "$1" ]
}
if matches_exist /home/Savio/Dsktop/check/*.csv &&
   matches_exist /home/Savio/check/*.txt; then
  echo " found."
else
  echo "not found."
fi

Note que ele procura por arquivos independentemente do seu tipo (regular, diretório, link simbólico, dispositivo, canal ...) enquanto seu [[ -f file ]] verifica se o arquivo existe e é um regular arquivo ou link simbólico para arquivo regular apenas (seria excluir diretórios, dispositivos ...).

    
por 21.08.2013 / 02:18
1

find provavelmente funcionaria melhor aqui.

csv=$(find /home/Savio/Dsktop/check -type f -name "*.csv")
txt=$(find /home/Savio/check/ -type f -name "*.txt")

O que você não vai recorrer aos subdiretórios.

    
por 20.08.2013 / 17:47
1

Esteja ciente de que if [[ -f "$file" ]] falhará se $file contiver mais de um nome de arquivo - o que provavelmente acontecerá quando você estiver selecionando o arquivo usando um caractere curinga.

Você deve verificar um nome de arquivo específico (sem curingas) ou usar a abordagem de Petey T e verificar se o número de arquivos encontrados por find é maior que 0:

csv=$(find /home/Savio/Dsktop/check -type f -name "*.csv")
txt=$(find /home/Savio/check/ -type f -name "*.txt")
if [[ ( -n $csv ) -a ( -n $txt ) ]]
then
    echo "found"
else
    echo "not found"
fi
    
por 20.08.2013 / 17:55
0

script bash para verificar se existem arquivos csv e para todos eles existe

#!/bin/bash
# count variable to check if csv files exists in current directory
count_file='ls -1 *.flac 2>/dev/null | wc -l'
if [ $count_file != 0 ]
then 
  for file in *.csv; do
    echo ${file##*/}
  done
fi 
    
por 29.10.2018 / 15:42