272 votes

Comment obtenir la liste des fichiers d'un répertoire dans un shell script ?

J'essaie d'obtenir le contenu d'un répertoire en utilisant le shell script.

Mon script est :

for entry in `ls $search_dir`; do
    echo $entry
done

donde $search_dir est un chemin relatif. Cependant, $search_dir contient de nombreux fichiers dont le nom comporte des espaces. 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 me rendre dans ce répertoire, utiliser for entry in * puis revenir en arrière, mais ma situation particulière m'empêche de le faire.

J'ai deux chemins relatifs $search_dir y $work_dir et je dois travailler sur les deux simultanément, en les lisant, en y créant/supprimant des fichiers, etc.

Que dois-je faire maintenant ?

PS : j'utilise bash.

453voto

Ignacio Vazquez-Abrams Points 312628
search_dir=/the/path/to/base/dir
for entry in "$search_dir"/*
do
  echo "$entry"
done

70voto

rrr Points 426

Il s'agit d'une façon de procéder dont 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 d'accès
*.txt retourne n'importe quoi.txt
Vous pouvez facilement vérifier ce qui sera listé en tapant la touche ls directement dans le terminal.

En fait, vous créez une variable yourfilenames qui contient tout ce que la commande list renvoie comme un élément distinct, puis vous le parcourez en boucle. La boucle crée une variable temporaire eachfile qui contient un seul élément de la variable qu'elle parcourt, dans ce cas un nom de fichier. Cette réponse n'est pas nécessairement meilleure que les autres, mais je la trouve intuitive parce que je suis déjà familiarisé avec la fonction ls et la syntaxe de la boucle for.

36voto

tegan Points 1919

Les autres réponses ici sont excellentes et répondent à votre question, mais c'est le premier résultat de Google pour "bash get list of files in directory", (ce que je cherchais pour sauvegarder une liste de fichiers), alors j'ai pensé que je posterais une réponse à ce problème :

ls $search_path > filename.txt

Si vous ne voulez qu'un certain type de fichier (par exemple, tous les fichiers .txt) :

ls $search_path | grep *.txt > filename.txt

Notez que $search_path est optionnel ; ls > nom_de_fichier.txt prendra en compte le répertoire actuel.

23voto

ghostdog74 Points 86060
for entry in "$search_dir"/* "$work_dir"/*
do
  if [ -f "$entry" ];then
    echo "$entry"
  fi
done

19voto

Victoria Stuart Points 21
$ pwd; ls -l
/home/victoria/test
total 12
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  a
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  b
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  c
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:32 'c d'
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  d
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32  dir_a
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32  dir_b
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:32 'e; f'

$ find . -type f
./c
./b
./a
./d
./c d
./e; f

$ find . -type f | sed 's/^\.\///g' | sort
a
b
c
c d
d
e; f

$ find . -type f | sed 's/^\.\///g' | sort > tmp

$ cat tmp
a
b
c
c d
d
e; f

Variations

$ pwd
/home/victoria

$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2

$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2

Notes :

  • . : dossier en cours
  • supprimer -maxdepth 1 pour effectuer une recherche récursive
  • -type f : recherche des fichiers et non des répertoires ( d )
  • -not -path '*/\.*' : ne pas renvoyer .hidden_files
  • sed 's/^\.\///g' : supprimez l'élément prépondérant ./ de la liste des résultats

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X