2010-11-10 8 views
14

Comment puis-je exécuter une certaine commande pour chaque fichier/dossier du dossier en cours?Exécuter la commande pour chaque fichier du répertoire en cours

J'ai commencé avec ceci en tant que script de base, mais cela semble fonctionner uniquement lorsque j'utilise des fichiers temporaires, et je n'aime pas vraiment l'idée. Est-ce qu'il y a un autre moyen?

FOLDER="."; 
DIRS=`ls -1 "$FOLDER">/tmp/DIRS`; 

echo >"/tmp/DIRS1"; 
while read line ; do 
    SIZE=`du "$FOLDER$line"`; 
    echo $SIZE>>"/tmp/DIRS1"; 
done < "/tmp/DIRS"; 

Pour toute personne intéressée, je voulais faire une liste de dossiers, classés par leur taille. Voici le résultat final

FOLDER="$1"; 
for f in $FOLDER/*; do 
    du -sb "$f"; 
done | sort -n | sed "s#^[0-9]*##" | sed "s#^[^\./]*##" | xargs -L 1 du -sh | sed "s|$FOLDER||"; 

qui conduit à du -sb $FOLDER/* | sort -n | sed "s#^[0-9]*##" | sed "s#^[^\./]*##" | xargs -L 1 du -sh | sed "s|$FOLDER||";

+3

Ce sont des répertoires. Pas de dossiers. ;) –

+0

Voir ma réponse [ici] (http: // serverfault.com/q/62411/1293 # 62522) pour un moyen de le faire en appelant 'du' une seule fois au lieu de * deux fois pour chaque fichier *. Vous n'aurez pas besoin d'une boucle 'for'. Vous pouvez ajouter '--max-depth = 1' au' du' dedans si cela est nécessaire et vous pouvez ajouter votre 'sed 's | $ FOLDER ||" '. –

+0

@Dennis Williamson: bonne réponse, n'a pas pensé à se pencher sur 'awk'. – Quamis

Répondre

25

Peut-être xargs, qui reinvokes la commande spécifiée après pour chaque ligne supplémentaire de paramètres reçus sur stdin ...

ls -1 $FOLDER | xargs du 

Mais, dans ce cas, pourquoi pas ...

du * 

...? Ou ...

for X in *; do 
    du $X 
done 

(Personnellement, j'utilise zsh, où vous pouvez modifier le motif de glob pour ne trouver que dire des fichiers réguliers, ou uniquement les répertoires, seuls liens symboliques etc - je suis sûr qu'il ya quelque chose de similaire dans bash - peut creuser pour les détails si vous en avez besoin).

Est-ce qu'il me manque une partie de votre exigence?

+0

Le script final doit afficher une liste de fichiers/dossiers triés par taille, classés par taille – Quamis

+1

+1 pour 'xargs'. Outil merveilleusement sous-estimé. –

+0

Eh bien, dans ce cas 'du * | sort -n -k1' seul devrait suffire. Non? –

0

Cela fonctionne pour tous les fichiers dans le répertoire courant:

do 
    /usr/local/mp3unicode/bin/mp3unicode -s cp1251 --id3v2-encoding unicode "$file" 
done 
2

Il est inutile d'analyser la sortie de ls pour faire défiler sur les fichiers. Bash peut le faire avec une extension générique.

Le stockage du résultat de du dans une variable pour l'afficher dans un fichier est également une utilisation inutile d'une variable.

Ce que je propose:

for i in ./tmp/DIRS/* 
do 
    du "$i" >> "/tmp/DIRS1" 
done 
3

Quel est le problème avec quelque chose comme ça?

function process() { 
    echo "Processing $1" 
} 

for i in * 
do 
    process $i 
done 

Vous pouvez mettre tout le « travail » que vous voulez faire dans la fonction process. Cela le fera pour votre répertoire actuel.

+0

Pouvez-vous s'il vous plaît regarder ce cas? https://stackoverflow.com/questions/45482766/script-to-execute-command-to-all-files-in-folder?noredirect=1#comment77926070_45482766 – upicik

6

La commande find vous permet également d'exécuter une commande pour chaque élément trouvé. Sans arguments plus il trouvera tous les fichiers et dossiers dans le répertoire en cours, comme celui-ci:

$ find -exec du -h {} \; 

La partie {} est la « variable » où le match est placé, ici comme argument de du. \; termine la commande.

+2

C'est la première fois que je vois un exemple de ' trouver »qui a effectivement expliqué comment la commande complète donnée fonctionne réellement. Merci! – alanaktion

Questions connexes