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
#!/bin/bash
count=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo true
fi
#/bin/bash
myarray=(`find ./ -maxdepth 1 -name "*.py"`)
if [ ${#myarray[@]} -gt 0 ]; then
echo true
else
echo false
fi
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
shopt -s nullglob
if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ]
then
echo true
fi
#!/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
shopt -s nullglob
set -- $(echo *.ext)
if [ "${#}" -gt 0 ];then
echo "got file"
fi
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.
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.
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
).
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
.
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
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.