5 votes

Déplacer plusieurs fichiers dans un répertoire si leurs noms contiennent la même chaîne présente dans le nom du répertoire.

J'ai plusieurs fichiers dans un même dossier :

ABA.xy
BEB.xy
ACA.xy

Les mêmes fichiers avec une extension différente dans un autre dossier

ABA.rr
BEB.rr
ACA.rr

Ensuite, j'ai un seul dossier pour chaque nom de fichier

ABA
BEB
ACA

Je voudrais faire ce qui suit. si le fichier avec l'extension .xy y .rr ont le même nom que le dossier, déplacez-vous vers ce dossier. Par exemple

ABA.xy and ABA.rr in ABA

Je connais mv mais je pense qu'ici je dois écrire un petit script pour le faire.

9voto

αғsнιη Points 33236

En supposant que vos fichiers stockés dans source et vos dossiers cibles sont dans dest comme l'arbre qui suit :

$ tree source
source
 dir1
    ABA.xy
    ACA.xy
    BEB.xy
 dir2
     ABA.rr
     ACA.rr
     BEB.rr
2 directories, 6 files

$ tree dest
dest
 ABA
 ACA
 BEB
3 directories, 0 files

La commande serait :

find source -type f -exec sh -c 'noext="${0%.*}"; echo mv '{}' "dest/${noext##*/}/"' {} \;
  • el source est le répertoire source ou spécifier le répertoire parent.

  • noext="${0%.*}" supprime l'extension des fichiers et enregistre le résultat dans le fichier noext variable.

  • "${noext##*/}" supprime la partie chemin d'accès au fichier de noext et récupère le seul nom de fichier.

  • dest est le répertoire parent de la destination.

  • Alors mv '{}' "dest/${noext##*/}/"' déplace le fichier actuel vers dest/$noext répertoire.

    Le contenu de noext dans la commande ci-dessus, il n'y a que le nom de fichier sans extension et le chemin qui spécifie le répertoire de destination qui est le même nom que le nom du fichier courant.

Voici un exemple de test qui montre le résultat de la commande

Notez que cette commande a utilisé echo pour les tests et les essais. Si vous êtes sûr de ce que vous faites, supprimez l'option echo devant mv pour effectuer le déplacement réel.

2voto

Mufaka Points 54

Une approche légèrement différente utilisant rename :

rename 's#.*/(.+)(\.\w+)#mkdir "dest/$1"; "dest/$1/$1$2"#e' source/{a,b}/*

Il s'agit essentiellement d'utiliser une expression régulière pour traduire les chemins. Nous utilisons un petit peu de Perl (que rename ) pour créer les nouveaux répertoires et renommer déplace le fichier à la fin.

Ce n'est pas très malin. Il ne cherchera pas les cas où il n'y a pas de fichier correspondant (on pourrait chercher et supprimer les répertoires avec un seul fichier) et il explosera probablement s'il y a des fichiers sans extension.

$ mkdir -p source/{a,b} dest
$ touch source/a/{ABA,BEB,ACA}.xy
$ touch source/b/{ABA,BEB,ACA}.rr
$ tree
.
 dest
 source
     a
        ABA.xy
        ACA.xy
        BEB.xy
     b
         ABA.rr
         ACA.rr
         BEB.rr

$ rename 's#.*/(.+)(\.\w+)#mkdir "dest/$1"; "dest/$1/$1$2"#e' source/{a,b}/*
$ tree
.
 dest
    ABA
       ABA.rr
       ABA.xy
    ACA
       ACA.rr
       ACA.xy
    BEB
        BEB.rr
        BEB.xy
 source
     a
     b

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