2013-07-08 6 views
1

J'ai un fichier de noms de fichiers, et je dois être en mesure d'obtenir la taille de ces fichiers en utilisant bash. J'ai le script suivant qui fait cela, mais il imprime le nom de fichier et la taille sur différentes lignes, je préférerais le faire sur une seule ligne si possible.Attribuer stat | grep | awk à une variable dans bash

#!/bin/sh 
filename="$1" 
while read -r line 
do 
    name=$line 
    vars=(`echo $name | tr '.' ' '`) 
    echo $name 
    stat -x $name | grep Size: | awk '{ print $2 }' 
done < "$filename" 

Je serais ravi d'avoir la forme suivante:

filename: $size 

Comment puis-je faire cela? (j'utilise OSX donc la version un peu étrange de stat.)

+1

Afficher nous échantillonner le contenu de "filename", Exemple de sortie de "stat -x $ name" sur le contenu de "filename" qui vous intéresse, et la sortie finale que vous voulez que le script produise étant donné cet exemple d'entrée. –

+0

où utilisez-vous le résultat de votre 'vars = (...)'. Est-ce que cela doit être dans votre question? Bonne chance. – shellter

Répondre

0
echo $name: $(stat -x $name | sed -n '/^Size:/s///p') 
+0

Cela ne fonctionne pas, je ne peux pas faire le $ (stuff | stuff). Cela ne me donne rien. – KevinShaffer

1

passe -n au echo pour empêcher un saut de ligne d'être ajouté. Donc, changer

echo $name 

à

echo -n $name 

et d'ajouter le séparateur : entre le nom du fichier et la taille du fichier

echo -n ${name}": " 
0

Cela devrait faire l'affaire:

while read f 
do 
    echo "${f} : $(stat -L -c %s ${f})" 
done < "${filename}" 
+0

La commande -c ne fonctionne pas sur les terminaux Mac OSX. – KevinShaffer

+0

Je vérifiais [la page de manuel bsd pour stat] (http://www.freebsd.org/cgi/man.cgi?query=stat) - essayez 'stat -f"% N:% z "" $ f "'. La boucle while peut être raccourcie avec 'xargs stat -f"% N:% z "<" $ filename "' –

+0

@KevinShaffer Dans ce cas, 'stat -L -f% z $ {f}' ... Ou voir commenter par @glennjackman pour une alternative sans le 'echo' et/ou la boucle ... – twalberg