commande bash pour chaque fichier d'un dossier

31

J'ai un ensemble de fichiers sur lesquels j'aimerais 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 fais renommer /my/data/Andrew.doc en /my/data/Andrew.txt Je voudrais le faire pour tous les fichiers .doc du dossier / my / data / et conserver le nom.

J'ai essayé plusieurs versions mais je suppose que j'ai une erreur dans la syntaxe car je suis nouveau sur Linux.

Robert
la source
→ un exemple un peu plus complet et pratique: stackoverflow.com/a/43474757/444255
Frank Nocke

Réponses:

76

Il y a au moins cent mille millions de façons différentes d'aborder cela, mais voici les principaux prétendants:

The Bash for loop

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

En utilisant find

La findcommande a une jolie petite execcommande qui est idéale pour exécuter des choses (avec quelques mises en garde). La recherche est meilleure que la globalisation 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 findc'est récursif, vous pouvez donc utiliser -maxdepth 1pour conserver finddans le répertoire de travail actuel. -type fpeut être utilisé pour filtrer les fichiers normaux.

Si nous ne faisons que renommer doc txt ...

La renamecommande ressemble à sed dans la recherche. Évidemment, cela ne fera rien pour convertir le format.

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