web-dev-qa-db-fra.com

Automatisation d'un script bash de renommer des fichiers

J'ai beaucoup de documents sur mon lecteur avec l'extension .odt. Exemple: enter image description here

Cependant, je trouve que le .odt est gênant lorsque je parcours beaucoup de documents.

J'ai donc réussi à écrire ce script (removeODT.sh):

#!/bin/bash

for file in *.odt
do
 mv "$file" "${file%.odt}"
done

Qui supprime l’extension .odt des fichiers .odt du répertoire dans lequel j’exécute le script.

par exemple. Ouvrez le terminal dans ~/Desktop/MyDocuments et tapez

sh /home/user1/BashScripts/removeODT.sh

Cela supprime l'extension .odt de tous les fichiers de MyDocuments.

Mais après la suppression de l'extension, je ne peux plus utiliser les fichiers sur d'autres systèmes d'exploitation ni rechercher dans le contenu du document avec loook.

Donc, pour remédier à cela, j'ai créé un deuxième script pour ajouter l'extension .odt si nécessaire (addODT.sh):

#!/bin/bash

for file in *
do
 mv "$file" "${file%}.odt"
done

J'aimerais maintenant que ces scripts changent chaque document du répertoire parent spécifié et de tous ses sous-répertoires au lieu d'un seul répertoire, comme ils le font maintenant.

par exemple. "Supprimer les extensions .odt des fichiers de Documents et de tous ses sous-dossiers"

Cela me permettrait de modifier tous mes fichiers avec un seul script sans avoir à exécuter le script pour chaque dossier séparément. Mais je suis assez nouveau dans ce domaine, je ne sais donc pas comment m'y prendre.

P.S. Une solution idéale serait de cacher l’extension .odt dans Nautilus mais, autant que je sache, c’est impossible.

2
Rtsne42

Vous pouvez utiliser find pour parcourir les répertoires de manière récursive.

find -type f -exec mv {} {}.odt \;

Supprimer l'extension est un peu plus problématique:

find -name '*.odt' -exec bash -c 'f={}; mv "$f" "${f%.odt}"' \;

Mais vous pouvez également créer un script pour supprimer l'extension et l'appeler depuis find pour le simplifier:

find -name '*.odt' -exec remove_odt.sh {} \;

Comme vous pouvez le deviner, {} sera remplacé par le nom de chaque fichier par exec, le dernier \; indique l'endroit où la commande à exécuter se termine.

De même, n'utilisez pas sh pour exécuter bash les scripts, sh et bash sont des bêtes différentes.

7
choroba