web-dev-qa-db-fra.com

commande bash pour chaque fichier d'un dossier

J'ai un ensemble de fichiers sur lequel 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.

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

J'ai essayé plusieurs versions mais je suppose que quelque chose ne va pas dans la syntaxe car je suis nouveau pour Linux.

28
Robert

Il existe au moins cent milliards de façons différentes d'aborder cette question, mais voici les principaux candidats:

Le Bash pour la boucle

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

Utiliser find

La commande find a une jolie petite commande exec qui est idéale pour exécuter des tâches (avec certaines mises en garde). La recherche est meilleure que la lecture 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, vous pouvez donc utiliser -maxdepth 1 pour conserver find dans le répertoire de travail en cours. -type f peut être utilisé pour filtrer les fichiers normaux.

Si nous sommes juste renommer doc en txt ...

La commande rename ressemble à sed en recherche. Évidemment, cela ne fera rien pour convertir le format.

rename 's/doc$/txt/' *.doc
66
Oli
for i in *.doc ; do mv "$i" $(echo $i | sed s/doc/txt/) ; done
21
DIRAVI