Je veux parcourir chaque ligne dans la sortie de: ls -l /some/dir/*
En ce moment, j'essaye: for x in $(ls -l $1); do echo $x; done
Cependant, cela itère sur chaque élément de la ligne séparément, donc j'obtiens:
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:07
File1
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:17
File2
Mais je veux parcourir chaque ligne dans son ensemble, cependant. Comment je fais ça?
Réponses:
Définissez IFS sur une nouvelle ligne, comme ceci:
Mettez un sous-shell autour de lui si vous ne voulez pas définir IFS de manière permanente:
Ou utilisez while | lire à la place:
Une autre option, qui exécute while / read au même niveau du shell:
la source
read -r
sinon bash supprimera les contre-obliques non échappées des données.Cela dépend de ce que vous voulez faire avec chaque ligne. awk est un utilitaire utile pour ce type de traitement. Exemple:
.. sur mon système imprime le nom et la taille de chaque élément du répertoire.
la source
Comme déjà mentionné, awk est le bon outil pour cela. Si vous ne voulez pas utiliser awk, au lieu d'analyser la sortie de "ls -l" ligne par ligne, vous pouvez parcourir tous les fichiers et faire un "ls -l" pour chaque fichier individuel comme ceci:
la source
Vous pouvez également essayer la
find
commande. Si vous ne voulez que des fichiers dans le répertoire courant:Exécuter une commande sur chacun d'eux?
Compter les lignes, mais uniquement dans les fichiers?
la source
L'utilitaire read (1) avec la redirection de sortie de la commande ls (1) fera ce que vous voulez.
la source
Alors, pourquoi personne n'a suggéré d'utiliser simplement des options qui éliminent les parties qu'il ne veut pas traiter.
Sur Debian moderne, vous obtenez simplement votre fichier avec:
De plus, vous n'avez pas à faire attention au répertoire dans lequel vous l'exécutez si vous utilisez le répertoire complet:
Cette dernière commande que j'utilise ci-dessus et j'obtiens la sortie suivante:
la source