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 -----
1
ivanevf
eng
1074
avr
22
13h07
Fichier1-r - r -----
1
ivanevf
eng
1074
avr
22
13h17
Fichier2
Je veux cependant parcourir chaque ligne dans son ensemble.
Comment je fais ça?
Merci.
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
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.
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
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 {} \;
L'utilitaire read (1) ainsi que la redirection de sortie de la commande ls (1) feront ce que vous voulez.
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