60 votes

commande bash pour chaque fichier dans un dossier

J'ai un ensemble de fichiers sur lesquels je voudrais appliquer la même commande et la sortie doit contenir le même nom que le fichier traité mais avec une extension différente.

Je suis en train de renommer /my/data/Andrew.doc en /my/data/Andrew.txt. Je voudrais faire cela pour tous les fichiers .doc du dossier /my/data/ et conserver le nom.

J'ai essayé plusieurs versions, mais je pense qu'il y a quelque chose qui ne va pas dans la syntaxe, car je suis nouveau sur Linux.

116voto

Mufaka Points 54

Il y a au moins cent mille millions de façons différentes d'aborder la question, mais voici les principales :

Le Bash boucle for

for f in ./*.doc; do
    # do some stuff here with "$f"
    # remember to quote it or spaces may misbehave
done

Utilisation de find

En find commande a un joli petit exec qui est idéale pour faire fonctionner des choses (avec quelques réserves). Find est meilleur que le globbing de base car vous pouvez vraiment filtrer les fichiers que vous sélectionnez. Faites attention à la syntaxe étrange.

find . -iname '*.doc' -exec echo "File is {}" \;

Notez que find est récursif, donc vous pourriez vouloir utiliser -maxdepth 1 pour garder find dans le répertoire de travail actuel. -type f peut être utilisé pour filtrer les fichiers réguliers.

Si nous sommes juste renommer doc vers txt...

En rename est similaire à la commande sed dans la recherche. Évidemment, cela ne fera rien pour convertir le format.

rename 's/doc$/txt/' *.doc

33voto

Vin Points 31
for i in *.doc ; do mv "$i" $(echo $i | sed s/doc/txt/) ; done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X