Parcourir toutes les entrées (c'est-à-dire les fichiers et dossiers) d'un dossier dir :
for entree in $dir/*
do
# faire quelque chose
done
Pour tester si une entrée est un dossier on peut utiliser la condition suivante :
if [[ -d $entree ]] # d pour directory
then
# ...
fi
Pour tester si une entrée est un fichier on peut utiliser la condition suivante :
if [[ -f $entree ]] # f pour file
Pour utiliser des commandes dans les tests : on a pas besoin des (( )) ni des [[ ]], on utilise juste le retour 0 ou 1 de la commande.
if grep salut fichier.txt
Pour sauvegarder dans une variable le résultat d'une commande :
a=$( grep // fichier.txt )
Ecrire un script qui copie tous les fichiers d'un dossier fourni en paramètre, le nom de la copie doit finir par .save.
dir=$1
for entree in $dir/*
do
if [[ -f entree ]]
then
cp $fichier $fichier.save
fi
done
Ecrire un script qui supprime tous les fichiers dont l'extension finit par .save du dossier en paramètre.
dir=$1
for entree in $dir/*
do
if [[ $entree == *.save ]]
then
rm $entree
fi
done
Réécrire l'exercice précédent en vérifiant qu'un paramètre a bien été fourni. Si aucun paramètre n'a été fourni, afficher "Pas de dossier spécifié" et quitter le script avec la commande exit.
Réécrire l'exercice précédent de sorte que si aucun paramètre n'a été fourni, on utilise le dossier courant à la place.
Ecrire un script qui supprime tous les fichiers du dossier en paramètre qui contienne //.
Réécrire ce script avec un second paramètre qui sera la chaine de caractères à chercher.
for entree in $1/*
do
if grep -q // $entree
then
rm $entree
fi
done
Afficher le nom de tous les fichiers qui ont été modifiés il y a moins d'une heure dans le dossier en paramètre.
Indication : utiliser les commandes suivantes
date +%s # affiche le timestamp actuel
date +%s -r fichier.txt # affiche le timestamp en secondes de la dernière modification
for entree in $1/*
do
if [[ -f $entree ]]
then
t_actuel=$(date +%s)
t_fichier=$(date +%s -r $entree)
diff=$(( $t_actuel - $t_fichier ))
if (( $diff <= 3600 ))
then
echo $entree
fi
fi
done
Ecrire un script qui pour chaque fichier du dossier en paramètre, supprime les lignes du fichier qui contienne //.
Indication : utiliser l'option -v de grep.
for entree in $1/*
do
if [[ -f $entree ]]
then
grep -v // $entree > tmpfile
mv tmpfile $entree
fi
done
Ecrire un script qui affiche le nombre de fichiers du dossier en paramètre qui contienne plus de 10 caractères.
c=0
for entree in $1/*
do
if [[ -f $entree ]]
then
a=$(wc -c < $entree)
if (( $a >= 10 ))
then
c=$(( $c + 1))
fi
fi
done
echo $c