Comment obtenir la liste des fichiers d'un répertoire dans un script shell?
J'essaie d'obtenir le contenu d'un répertoire en utilisant un script shell.
Mon script est:
for entry in `ls $search_dir`; do
echo $entry
done
Où $search_dir
est un chemin relatif. Cependant, $search_dir
contient de nombreux fichiers avec des espaces dans leurs noms. Dans ce cas, ce script ne s'exécute pas comme prévu.
Je sais que je pourrais utiliser for entry in *
, mais cela ne fonctionnerait que pour mon répertoire actuel.
Je sais que je peux changer dans ce répertoire, utiliser for entry in *
puis revenir en arrière, mais Ma situation particulière m'empêche de faire que.
J'ai deux chemins relatifs $search_dir
et $work_dir
, et je dois travailler sur les deux simultanément, en les lisant en créant/supprimant des fichiers, etc.
Alors Que dois-je faire maintenant?
PS: j'utilise bash.
6 réponses
for entry in "$search_dir"/*
do
echo "$entry"
done
Les autres réponses ici sont géniales et répondent à votre question, mais c'est le meilleur résultat google pour "bash get list of files in directory", (que je cherchais pour enregistrer une liste de fichiers) donc j'ai pensé poster une réponse à ce problème:
ls $search_path > filename.txt
Si vous voulez seulement un certain type (par exemple any.fichiers txt):
ls $search_path | grep *.txt > filename.txt
Notez que $search_path est facultatif; ls > filename.txt fera le répertoire courant.
for entry in "$search_dir"/* "$work_dir"/*
do
if [ -f "$entry" ];then
echo "$entry"
fi
done
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"
C'est une façon de le faire où la syntaxe est plus simple à comprendre pour moi:
yourfilenames=`ls ./*.txt`
for eachfile in $yourfilenames
do
echo $eachfile
done
./
est le répertoire de travail actuel mais peut être remplacé par n'importe quel chemin*.txt
retourne n'importe quoi.txt
Vous pouvez vérifier ce qui sera répertorié facilement en tapant la commande ls
directement dans le terminal.
Fondamentalement, vous créez une variable yourfilenames
contenant tout ce que la commande list renvoie en tant qu'élément séparé, puis vous la parcourez. La boucle crée une variable temporaire {[5] } qui contient un seul élément de la variable qu'il parcourt en boucle, dans ce cas un nom de fichier. Ce n'est pas nécessairement mieux que les autres réponses, mais je le trouve intuitif car je connais déjà la commande ls
et la syntaxe de la boucle for.
Sur la version Linux, je travaille avec (x86_64 GNU / Linux) les travaux suivants:
for entry in $search_dir/*
do
echo $entry
done