web-dev-qa-db-fra.com

Itération sur chaque ligne de sortie ls -l

Je veux parcourir chaque ligne de la sortie de ls -l /some/dir/* Right maintenant, je suis en train d'essayer: for x in $(ls -l $1); do echo $x done;

-r - r ----- 

ivanevf 
eng 
1074 
avr 
22 
13h07 
Fichier1 

-r - r ----- 

ivanevf 
eng 
1074 
avr 
22 
13h17 
Fichier2 

Je veux cependant parcourir chaque ligne dans son ensemble.

Comment je fais ça?

Merci.

96
Ivan

Définissez IFS sur newline, comme ceci:

IFS='
'
for x in `ls -l $1`; do echo $x; done

Mettez un sous-shell autour si vous ne voulez pas définir IFS de manière permanente:

(IFS='
'
for x in `ls -l $1`; do echo $x; done)

Ou utiliser pendant | lire à la place:

ls -l $1 | while read x; do echo $x; done

Une autre option, qui exécute le moment/lu au même niveau de shell:

while read x; do echo $x; done << EOF
$(ls -l $1)
EOF
208
Randy Proctor

Cela dépend de ce que vous voulez faire avec chaque ligne. awk est un utilitaire utile pour ce type de traitement. Exemple:

 ls -l | awk '{print $9, $5}'

.. sur mon système imprime le nom et la taille de chaque élément du répertoire.

7
Adam Holmberg

Comme déjà mentionné, awk est le bon outil pour cela. Si vous ne souhaitez pas utiliser awk, au lieu d'analyser la sortie ligne par ligne de "ls -l", vous pouvez effectuer une itération sur tous les fichiers et faire un "ls -l" pour chaque fichier individuel, comme ceci:

for x in * ; do echo `ls -ld $x` ; done
4
Axel

Vous pouvez également essayer la commande find. Si vous ne voulez que des fichiers dans le répertoire actuel:

find . -d 1 -Prune -ls

Exécuter une commande sur chacun d'eux?

find . -d 1 -Prune -exec echo {} \;

Compter les lignes, mais uniquement dans les fichiers?

find . -d 1 -Prune -type f -exec wc -l {} \;

4
David Koski

L'utilitaire read (1) ainsi que la redirection de sortie de la commande ls (1) feront ce que vous voulez.

2
Steve Emmerson

Alors, pourquoi personne n’a-t-il suggéré d’utiliser simplement des options qui éliminent les parties qu’il ne veut pas traiter?.

Sur la Debian moderne, vous venez d’obtenir votre fichier avec:

ls --format=single-column 

De plus, vous ne devez pas faire attention au répertoire dans lequel vous l’exécutez si vous utilisez le répertoire complet:

ls --format=single-column /root/dir/starting/point/to/target/dir/

Cette dernière commande, j’utilise ce qui précède et j’obtiens le résultat suivant:

bot@dev:~/downloaded/Daily# ls --format=single-column /home/bot/downloaded/Daily/*.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141119_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141120_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141121_IENT1.txt.gz
0
BradChesney79