manière appropriée ditérer le contenu dun répertoire [duplicate]

Cette question a déjà des réponses ici :

Réponse

Vous avez juste besoin pour créer une liste de fichiers globaux correspondants, séparés par un espace:

for file in .* *; do echo "$file"; done 

Modifier

Ce qui précède peut réécrire sous une forme différente en utilisant lexpansion daccolades

 for file in {.*,*}; do echo "$file"; done 

ou même plus court : for file in {.,}*; do echo "$file"; done

Ajout du chemin pour les fichiers sélectionnés:

 for file in /path/{..?,.[!.],}*; do echo "$file"; done 

Ajout du chemin pour les fichiers sélectionnés fichiers:

 for file in /path/{.,}*; do echo "$file"; done 

Si vous voulez être sophistiqué et supprimer de la liste généralement inutile . et

remplacez simplement {.,}* par {..?,.[!.],}*.

Pour être complet, cela vaut la peine pour mentionner que lon peut également définir dotglob pour quil corresponde aux fichiers de points avec *.

shopt -s dotglob 

Dans zsh, il faut en plus définir nullglob pour éviter lerreur en cas de non-correspondance:

setopt nullglob 

ou ajoutez le qualificatif global N au modèle:

for file in /path/{.,}*(N); do echo "$file"; done 

Commentaires

  • Merci beaucoup! Donc, si je veux parcourir nimporte quel répertoire, je mets simplement le nom du répertoire devant chacun des éléments, nest-ce pas? comme for file in dir/.* dir/*; do
  • Ce ' nest pas si facile. .* correspond à . et .. (sauf en zsh). * reste * sil ny a pas de fichier correspondant. shopt -s gotglob est uniquement en bash.
  • Jobtiens zsh: no matches found: .* lorsque jexécute la ou les commandes dans cette réponse . Pourquoi cela arriverait-il? ls sur le répertoire montre les fichiers.
  • @Niyaz que ' est parce que zsh renvoie une erreur si un modèle non allumettes. Pour empêcher cette exécution setopt nullglob qui désactivera globalement cette fonctionnalité, ou ajoutez le qualificatif (N) après létoile globale, soit: for file in /path/{.,}*(N); do echo "$file"; done.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *