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

$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.

99
demandé sur David Gelhar 2010-03-13 09:03:45

6 réponses

for entry in "$search_dir"/*
do
  echo "$entry"
done
180
répondu Ignacio Vazquez-Abrams 2012-04-04 08:10:31

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.

19
répondu tegan 2014-10-23 16:13:51
for entry in "$search_dir"/* "$work_dir"/*
do
  if [ -f "$entry" ];then
    echo "$entry"
  fi
done
17
répondu ghostdog74 2012-04-04 08:10:18
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"
10
répondu Noel Yap 2015-10-06 16:48:32

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.

9
répondu rrr 2017-04-27 15:08:50

Sur la version Linux, je travaille avec (x86_64 GNU / Linux) les travaux suivants:

for entry in $search_dir/*
do
  echo $entry
done
-1
répondu Andrushenko Alexander 2018-09-04 18:41:38