2 votes

Renommer les fichiers et les dossiers dans tous les sous-répertoires pour supprimer les caractères.

J'ai des fichiers et des dossiers qui ont été enregistrés sous Linux sur un disque dur externe, certains de ces fichiers et dossiers contiennent les caractères ": :". Je veux supprimer ces caractères de tous les fichiers et dossiers du disque car j'ai des problèmes lorsque j'essaie de visualiser les fichiers dans Windows.

J'ai réussi à les supprimer d'un dossier en utilisant dans le terminal-

rename 's/:://' *::*.*

dans ce seul répertoire, mais je veux le faire pour tous les fichiers et dossiers du disque, et il y a beaucoup de sous-dossiers.

Que puis-je ajouter à la commande ci-dessus pour qu'elle fonctionne sur tous les sous-dossiers et fichiers dans les sous-dossiers ou existe-t-il une meilleure commande ?

Merci.

2voto

steeldriver Points 118154

Vous pouvez utiliser le find pour rechercher des fichiers et des répertoires de manière récursive ex.

find path/to/start/dir/ -depth -name '*::*.*' -exec rename 's/:://' {} +

Le site -depth est important si vous renommez des fichiers et les répertoires (sinon la commande risque de rendre "orphelins" certains fichiers correspondants en renommant les répertoires qui les contiennent avant d'avoir eu la possibilité de les renommer). Si vous souhaitez uniquement renommer des fichiers, vous pouvez ajouter la commande -type f et laisser tomber le -depth .

Je recommande d'exécuter d'abord la commande avec rename -n pour s'assurer qu'elle fait ce qu'il faut.

0voto

Astral Axiom Points 73

Vous pourriez essayer un script récursif. Voici quelque chose qui ressemble à ce qui pourrait fonctionner. Cela fonctionne sur un répertoire de test que je viens de créer et qui contient des fichiers et des répertoires qui contiennent des fichiers nommés comme vous le décrivez. Ce script parcourt récursivement toute l'arborescence des répertoires et remplace toute occurrence de : : dans tous les noms de fichiers par un point. Il est configuré pour accepter un répertoire ou une liste de répertoires comme argument ou arguments, mais il fonctionne aussi sur un seul fichier. Je ne suis pas sûr que cela prenne en compte toutes les considérations nécessaires ou les scénarios d'erreur possibles, donc ajustez-le en fonction de vos besoins si vous l'utilisez.

#!/bin/bash

function rmCols() {

    if [[ ! -e $1 ]]
    then
        usage "$1" 1
    fi

    if [[ -f $1 ]]
    then
        if [[ -w $1 ]]
        then
            rename :: . "$1"
        else
            usage "$1" 2
        fi
    elif [[ -d $1 ]]
    then
        if [[ -w $1 ]]
        then
            for THING in "$1"/*
            do
                if [[ -f $THING ]]
                then
                    rename :: . "$THING"
                elif [[ -d $THING ]]
                then
                    rmCols "$THING"
                fi
            done
        else
            usage "$1" 3
        fi
    else
        usage "$1" 4 
    fi
}

function usage() {
    echo "
Usage: 

    rmCols accepts a variable number of files and/or directories as arguments and will add the
    current date between the filename and the file type extension for all files in all directory 
    argument(s) or for any file argument(s), recursively.

Syntax:

    rmCols dirName_1 [dirName_2] [dirName_3] ......." >&2
    if [[ $2 -eq 1 ]]
    then
        echo "
Error: 

    There is no such file or directory as $1, check your spelling" >&2
        exit 1
    elif [[ $2 -eq 2 ]]
    then
        echo "
Error: 

    You do not have permission to change the file $1" >&2
        exit 2
    elif [[ $2 -eq 3 ]]
    then
        echo "
Error: 

    You do not have permission to change the directory $1" >&2
        exit 3
    elif [[ $2 -eq 4 ]]
    then
        echo "
Error: 

    $1 is something other than a file or directory" >&2
        exit 4
    fi
}

shopt -s nullglob

for item in "$@"
do
    [[ -h $item ]] && continue
    rmCols "$item"
done

exit 0

Cela ne change que les noms de fichiers et non les noms de répertoires, bien qu'une légère modification devrait permettre de gérer les noms de répertoires également. Il y a probablement un outil Linux qui fera cela sans script cependant, je ne suis tout simplement pas familier avec lui. Bien que cela fonctionne, je suis sûr qu'il existe une meilleure solution.

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