2010-03-13 4 views
85

J'essaie d'obtenir le contenu d'un répertoire en utilisant un script shell.Comment obtenir la liste des fichiers dans un répertoire dans 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 pour ce répertoire, utilisez for entry in * puis revenez, mais ma situation particulière m'empêche de le faire.

J'ai deux chemins relatifs $search_dir et $work_dir, et je dois travailler sur les deux en même temps, en les lisant la création/suppression de fichiers dans les etc.

Alors, que dois-je faire maintenant?

PS: J'utilise bash.

+0

https: // stackoverflow.com/questions/2437452/comment-obtenir-la-liste-des-fichiers-dans-un-repertoire-dans-un-shell-script # nouvelle-reponse – arun

Répondre

148
for entry in "$search_dir"/* 
do 
    echo "$entry" 
done 
+1

Pouvez-vous expliquer pourquoi 'pour entrer dans" $ search_dir/* "' ne fonctionne pas? Pourquoi nous devons placer '/ *' en dehors des guillemets? – mrgloom

+2

@mrgloom: Parce que vous devez laisser le shell globaliser le caractère générique. –

+2

cela ne fonctionne pas pour moi sur macos –

14
for entry in "$search_dir"/* "$work_dir"/* 
do 
    if [ -f "$entry" ];then 
    echo "$entry" 
    fi 
done 
9
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}" 
+1

Je sais que c'est assez vieux mais je n'arrive pas à obtenir la dernière commande 'xargs -0 -i echo" {} "', vous voulez m'expliquer un peu? En particulier, que fait la partie '-i echo" {} "'? De plus, j'ai lu sur la page 'man' que' -i' est déprécié maintenant et que nous devrions utiliser '-I' insted. – drkg4b

+1

'-i' substitue' {} 'avec l'argument. –

+0

Merci! C'est utile, aussi pour les lenteurs comme moi je pense que le '{}' est la chaîne qui est remplacée par les correspondances par la commande 'find'. – drkg4b

14

Les autres réponses ici sont grandes et répondre à votre question, mais ceci est le résultat de Google top pour « bash obtenir la liste des fichiers dans le répertoire », (que je cherchais à enregistrer une liste de fichiers), donc je pensais que je posterais une réponse à ce problème:

ls $search_path > filename.txt 

Si vous voulez seulement un certain type (par exemple tous les fichiers txt):

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

Notez que $ search_path est facultatif; ls> filename.txt fera le répertoire courant.

+0

Pas besoin d'utiliser grep pour obtenir uniquement les fichiers .txt: 'ls $ search_path/* .txt> filename.txt '. Mais plus important encore, il ne faut pas utiliser la sortie de la commande ls pour analyser les noms de fichiers. –

3

C'est une façon de le faire où la syntaxe est plus simple pour moi de comprendre:

yourfilenames=`ls ./*.txt` 
for eachfile in $yourfilenames 
do 
    echo $eachfile 
done 

./ est le répertoire de travail actuel, mais pourrait être remplacé par tout chemin
*.txt retours anything.txt
Vous pouvez vérifier ce qui sera listé 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 le parcourez. La boucle crée une variable temporaire eachfile qui contient un seul élément de la variable en boucle, dans ce cas un nom de fichier. Ce n'est pas forcément meilleur que les autres réponses, mais je le trouve intuitif car je connais déjà la commande ls et la syntaxe for loop.

0

Sur la version Linux, je travaille avec (x86_64 GNU/Linux) oeuvres suivantes:

for entry in $search_dir/* 
do 
    echo $entry 
done 
Questions connexes