Tout d'abord, je dois dire que le exemple bash
code utilisé dans cette réponse, présenté plus loin, n'est en aucun cas robuste, mais il fait le travail !
Avec les éléments suivants comme échantillon représentatif de la structure hiérarchique des répertoires :
.
ABCD
EFGH
IJKL
MNOP
A Most Violent Year (2014) 1180 20150807Lov
A Most Wanted Man (2014) 1146
A Nightmare on Elm Street (2010) 0432
A Perfect Getaway (2009) 0433
¡NO! (2012) 0939
QRST
UVWX
YZ
Puis, après avoir exécuté le exemple bash
code enregistré comme un bash
script et fonctionner à partir de l'intérieur de la répertoire contenant le structure hiérarchique montrent ci-dessus, les résultats pour le répertoires sera tel qu'indiqué ci-dessous, et étant donné que la sortie souhaitée déclarée est basée sur l'échantillon représentatif de l'entreprise. structure hiérarchique des répertoires montré ci-dessus :
.
ABCD
EFGH
IJKL
MNOP
(0432) A Nightmare on Elm Street (2010)
(0433) A Perfect Geatway (2009)
(0939) ¡NO! (2012)
(1146) A Most Wanted Man (2014)
(1180) A Most Violent Year (2014) 20150807Lov
QRST
UVWX
YZ
Pour utiliser le exemple bash
code En Terminal cd
à la répertoire contenant le ABCD
, EFGH
etc. répertoires et exécutez ce qui suit commandes :
touch rendir; nano rendir
Sur nano
copier et coller le exemple bash
code montré ci-dessous, dans le rendir
puis appuyez sur Control + X et ensuite Y et ensuite Enter .
Suivant :
chmod u+x rendir
Maintenant qu'il est exécutable, lancez-le en tapant :
./rendir
Ensuite, appuyez sur Enter pour l'exécuter.
Exemple bash
code :
#!/bin/bash
find -E . -type d -regex '.* [0-9]{4}$' > /tmp/foo
while read -r l; do
p="$(dirname "$l")"
d="$(basename "$l")"
n="$(awk '{print "("$NF")"}'<<<"$d")"
f="$(awk '{$NF=""; sub(/ $/, "", $0); print $0}'<<<"$d")"
echo mv "$l" "$p/$n $f"
done</tmp/foo
find -E . -type d -regex '.* [0-9]{4} .*$' > /tmp/foo
while read -r l; do
p="$(dirname "$l")"
d="$(basename "$l")"
n="$(awk '{print "("$(NF - 1)")"}'<<<"$d")"
f="$(awk '{$(NF - 1)=""; print $0}'<<<"$d" | awk 'sub(/ /," ")')"
echo mv "$l" "$p/$n $f"
done</tmp/foo
rm /tmp/foo
Notez que, tel qu'il est codé, il produira le résultat suivant mv
commandes qui serait exécuté si echo
n'était pas là. Après avoir testé et examiné la sortie pour voir que la mv
commandes sont correctement formées, vous pouvez éditer rendir
( nano rendir
) et supprime les deux occurrences de echo
et enregistrer le fichier, en utilisant à nouveau ( Control + X et ensuite Y et ensuite Enter ) et l'exécuter à nouveau.
À ce stade, vous devriez obtenir le résultat souhaité, comme indiqué dans le deuxième exemple. tree
structure hiérarchique des répertoires montré ci-dessus. Ce site exemple bash
code ne tient pas compte de tout écart par rapport à ce qui a été exprimé dans le PO et les commentaires du PO.
NOTE : Vous ne devez jamais exécuter code sans avoir d'abord été correctement sauvegardé et sans avoir testé la code sur un exemplaire de l'original.
Si je savais awk
mieux j'imagine qu'un awk
programme pourrait être écrit pour manipuler le chaîne de saisie à l'endroit souhaité chaîne de sortie en un seul appel de awk
mais je ne sais pas. awk
suffisamment bien pour y parvenir.
Nota: Le site exemple bash
code est juste cela et n'emploie pas de gestion des erreurs et n'a pour but que de montrer une des nombreuses façons d'accomplir une tâche. Il incombe toujours à l'utilisateur d'ajouter ou d'utiliser les outils appropriés. traitement des erreurs selon les besoins/la volonté.