web-dev-qa-db-fra.com

Vérifier si un certain type de fichier/extension existe dans le répertoire

Comment voudriez-vous savoir si les fichiers d'une extension spécifique sont présents dans un répertoire, avec bash?

Quelque chose comme

if [ -e *.flac ]; then 
echo true; 
fi 
57
Wurlitzer
#!/bin/bash

count=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count != 0 ]
then 
echo true
fi 
71
JeremyWeir
#/bin/bash

myarray=(`find ./ -maxdepth 1 -name "*.py"`)
if [ ${#myarray[@]} -gt 0 ]; then 
    echo true 
else 
    echo false
fi
14
wkl

Ceci utilise ls (1), si aucun fichier flac n'existe, ls signale une erreur et le script se ferme Sinon, le script continue et les fichiers peuvent être traités

#! /bin/sh
ls *.flac  >/dev/null || exit
## Do something with flac files here
11
frayser
shopt -s nullglob
if [[ -n $(echo *.flac) ]]    # or [ -n "$(echo *.flac)" ]
then 
    echo true
fi
7
#!/bin/bash
files=$(ls /home/somedir/*.flac 2> /dev/null | wc -l)
if [ "$files" != "0" ]
then
echo "Some files exists."
else
echo "No files with that extension."
fi
3
Ruel
   shopt -s nullglob
   set -- $(echo *.ext)
    if [ "${#}" -gt 0 ];then
      echo "got file"
    fi
2
ghostdog74

La solution supérieure (if [ -e *.flac ];) n'a pas fonctionné pour moi, donnant: [: too many arguments 

if ls *.flac >/dev/null 2>&1; alors cela fonctionnera.

2
Erik Buitenhuis

Vous devez choisir le drapeau que vous placez dans votre déclaration if et son rapport avec le résultat souhaité.

Si vous voulez vérifier uniquement les fichiers normaux et pas d'autres types d'entrées de système de fichiers, vous voudrez alors modifier votre squelette de code en:

if [ -f file ]; then
echo true;
fi

L'utilisation de -f limite la if aux fichiers normaux, alors que -e est plus volumineux et correspond à tous les types d'entrées de système de fichiers. Il existe bien sûr d’autres options telles que -d pour les répertoires, etc. Voir http://tldp.org/LDP/abs/html/fto.html pour une bonne liste.

Comme l'a souligné @msw, test (c.-à-d. [) s'étouffera si vous essayez de lui donner plus d'un argument. Cela peut arriver dans votre cas si le glob pour *.flac a renvoyé plus d'un fichier. Dans ce cas, essayez d’envelopper votre test if dans une boucle comme celle-ci:

for file in ./*.pdf
do
    if [ -f "${file}" ]; then
    echo 'true';
    break
    fi
done

De cette façon, vous break sur la première instance de l’extension de fichier souhaitée et pouvez continuer à utiliser le reste du script.

2
dtlussier

bash seulement:

any_with_ext () ( 
    ext="$1"
    any=false
    shopt -s nullglob
    for f in *."$ext"; do
        any=true
        break
    done
    echo $any 
)

if $( any_with_ext flac ); then
    echo "have some flac"
else 
    echo "dir is flac-free"
fi

J'utilise des parenthèses au lieu d'accolades pour m'assurer qu'un sous-shell est utilisé (ne voulez pas écraser votre paramètre actuel nullglob).

1
glenn jackman

Voici une solution n’utilisant pas de commandes externes (c’est-à-dire pas de ls), mais une fonction Shell. Testé à Bash:

shopt -s nullglob
function have_any() {
    [ $# -gt 0 ]
}

if have_any ./*.flac; then
    echo true
fi

La fonction have_any utilise $# pour compter ses arguments, et [ $# -gt 0 ] vérifie ensuite s'il existe au moins un argument. L'utilisation de ./*.flac au lieu de *.flac dans l'appel à have_any permet d'éviter les problèmes causés par des fichiers portant des noms tels que --help.

1
jochen

Vous pouvez utiliser -f pour vérifier s'il existe des fichiers d'un type spécifique:

#!/bin/bash

if [ -f *.flac ] ; then
   echo true
fi 
0
Uzi

Pour terminer, avec zsh:

if [[ -n *.flac(#qN) ]]; then
  echo true
fi

Ceci est listé à la fin de la section Expressions conditionnelles dans le manuel zsh. Puisque [[ désactive la suppression du nom de fichier, nous devons forcer la génération de nom de fichier en utilisant (#q) à la fin de la chaîne de sélection, puis le drapeau N (option NULL_GLOB) pour forcer la chaîne générée à être vide au cas où aucune correspondance ne serait trouvée.

0
Iso