web-dev-qa-db-fra.com

Script Bash: renommer un fichier batch pour supprimer / modifier tous les caractères interdits sous un système de fichiers Windows

J'ai besoin d'une aide ici, j'ai un projet où nous devons modifier les noms de fichiers et de dossiers dans un répertoire spécifique afin de supprimer ou de remplacer tous les caractères qui seraient considérés comme illégaux sous Windows, avec quelques caractères supplémentaires. Quitter l'extention finale

ILLEGAL CHARACTERS:

    < (less than)                         MAKE -
    > (greater than)                      MAKE -
    : (colon)                             MAKE -
    " (double quote)                      REMOVE
    / (forward slash)                     MAKE -
    \ (backslash)                         MAKE -
    | (vertical bar or pipe)              MAKE -
    ? (question mark)                     REMOVE
    * (asterisk)                          REMOVE


ADDITIONAL CHARACTERS:

    REMOVE '
    REMOVE %
    REMOVE #
    REMOVE ^
    REMOVE !@#$%^&()=+][{};,`~

Tout caractère précédé de "MAKE -" doit être remplacé par un trait d'union), par exemple, un fichier nommé John\Sykes.doc doit devenir John-Sykes.doc. Si le caractère est marqué "REMOVE", il doit être supprimé et rien ne doit être mis à sa place, par exemple un fichier nommé John? Sykes.doc deviendrait JohnSykes.doc.

C'est une étape assez importante dans un très grand projet de notre organisation et je n'ai pas encore réussi à créer de script. Je sais comment faire des versions simples, cela ne peut changer que les noms de fichiers au cas par cas, mais je ne peux pas le faire en masse. Par exemple, je peux créer un script pour supprimer uniquement @ des noms de fichiers, mais je ne sais pas comment inclure des dossiers/répertoires, ni comment inclure tous les autres caractères de ce script.

Dans l'idéal, le script devrait être exécuté pour la première fois et générer un fichier utilisant écho avec toutes les modifications à apporter, notamment le chemin d'accès complet, puis le chemin modifié. Le script devrait alors être légèrement modifié pour utiliser mv à la place, ou bien il pourrait faire référence au fichier créé avec echo et effectuer toutes les modifications nécessaires à l'aide de celui-ci ...

Toute aide serait appréciée, car c’est vraiment très important et je n’ai pas les compétences pour le moment.

Une note finale, je ne peux pas utiliser la commande #rename. Cela casse notre politique informatique.

--- (_ edit _

Je ne peux utiliser aucune version de Rename, le responsable de mon service informatique. l'a interdit. Je suis sûr qu'il a ses raisons, mais je ne peux pas dire que je les connais. La commande renommer n'est pas du tout disponible sur nos serveurs.

Cela signifie que je dois utiliser pure bash pour effectuer l'opération.

Il n'y a pas d'exigences supplémentaires. Fondamentalement, je dois pouvoir exécuter un script pour afficher toutes les modifications qui seront apportées à un fichier, avant toute modification. Cela nous permettra d’examiner les résultats et de nous assurer qu’il n’y a pas de trucs. Après cela, nous voulons l'exécuter (le même script ou un script différent) pour apporter les modifications.

Tout ce dont j'ai besoin est indiqué ci-dessus, de sorte que tout ce qui est marqué "MAKE -" doit devenir un trait d'union et tout ce qui est marqué "REMOVE" doit simplement disparaître.

S'il y a autre chose, s'il vous plaît demander. Je me ferai un plaisir de faire d'autres commentaires.

1
Ludicael

Créez un script rename1.sh:

#! /bin/bash
old=$1
new=${old//[\''"?*%#^!@$&()=+[]{};,`~']}
new=${new//['<>:\|']/-}                   # I removed /, see below.
if [[ -e $new ]] ; then
    if [[ $old != $new ]] ; then
        echo Cannot rename "$old" to "$new" - target already exists.
    fi
else
    mv "$old" "$new"
fi

Il renomme un fichier en fonction des règles données en utilisant le développement de paramètres. Pour renommer un sous-arbre, exécutez-le avec find:

find /path -exec rename1.sh {} \;

Êtes-vous sûr de vouloir remplacer / par -? Cela mettrait tous les fichiers dans le même répertoire.

1
choroba