Par exemple, je veux mv (.*?).sql $1.php
,
Existe-t-il une commande qui me permette de spécifier des modèles de renommage ?
Par exemple, je veux mv (.*?).sql $1.php
,
Existe-t-il une commande qui me permette de spécifier des modèles de renommage ?
Comme d'autres l'ont mentionné, rename
est bon dans ce domaine, mais lisez la page de manuel ( man rename
) avant de l'essayer. Il existe au moins deux outils totalement différents appelés rename
et le choix de l'un ou l'autre dépend de votre distribution. Les appeler de manière incorrecte peut être dangereux.
Voici la page de manuel pour la version basée sur perl de Larry Wall, livrée avec Ubuntu. Vous lui donnez une expression perl comme rename 's/\.sql$/.php/' *.sql
Voici la page de manuel pour le renommage fourni avec les anciennes distributions Red Hat et CentOS. L'utilisation est une simple substitution de chaîne comme rename .sql .php *.sql
Vous pouvez également utiliser un one-liner bash pour traiter chaque fichier un par un :
$ for f in *.sql; do mv -i "$f" "${f%%.*}.php"; done
Vous pouvez également essayer de saisir
for i in $(\ls -d *.sql)
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done
Ou pour utiliser les expressions rationnelles, modifiez légèrement le texte pour qu'il devienne
for i in $(\ls -d | egrep -e '.*\.sql')
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done
pour un peu de codage Shell.
En tant que plombier, j'aime les tuyaux :)
Note : cette réponse est longue - en tant que nouveau venu, j'apprécie que quelqu'un qui s'y connaît prenne le temps d'expliquer. Si vous n'êtes pas un nouveau venu, veuillez excuser la longueur et la verbosité de cette réponse.
ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/' | bash
Où ?
ls -1 *_201[67][0-9]*
liste tous les fichiers correspondant au motif, dans ce cas je recherche les fichiers dont le nom contient la date sous la forme 'YYYYMMDD'
sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'
# : | | | | | | | |: :
# : |^2....^ ^3..................^^4.......^ |: :
# :^1..............................................................^: :
# /................filename.................pattern................./...mkdir...and....mv...command.../
^1 : 1er groupe de capture - le nom de fichier entier
^2 : 2ème groupe de capture - la 1ère partie du modèle de nom de fichier
^3 : 3ème groupe de capture - la 2ème partie du nom de fichier - ici, la date est 'YYYYMMDD'.
^4 : 4ème groupe de capture - partie facultative du nom de fichier entre la date et l'extension, et l'extension elle-même
Ainsi, .... si j'ai un fichier nommé
CallLog_555123412_20161231-214403.7z
...puis
mkdir -p \2\/\3; mv \1 \2\/\3\/\1
signifie en fait
# make directory and sub-directory
mkdir -p CallLog_555123412/20161231
# move file from current directory to sub-sub-directory just created
mv CallLog_555123412_20161231-214403.7z CallLog_555123412/20161231/CallLog_555123412_20161231-214403.7z
Notez que la sortie de la commande sed est acheminée vers 'bash' pour l'exécuter. Afin de voir les déplacements de fichiers proposés SANS les déplacer, supprimez d'abord le '| bash' à la fin, et essayez comme suit :
ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'
Cela n'apportera aucun changement, mais vous verrez la commande qui sera exécutée SI vous l'exécutez avec '| bash' à la fin.
Ceci est utile car vous pouvez créer tous les sous-répertoires que vous souhaitez à partir de parties du nom de fichier, ou de tout autre élément que vous ajoutez au texte "replacement" dans la commande sed. Notez que sed nécessite beaucoup de caractères d'échappement.
Crochets SED Regex :
(...) nécessite un échappement pour les groupes de capture --> \N(...\N)
{m,n} nécessite un échappement pour quantifier l'objet précédent --> \N{m,n\N}
/ nécessite un échappement dans la chaîne de remplacement --> \/
[...] NE PAS exiger d'échappement pour les classes de caractères
\1 dans la chaîne de remplacement fait référence au premier groupe capturé, et ainsi de suite...
AVERTISSEMENT DE SÉCURITÉ : NE JAMAIS PIPER QUELQUE CHOSE DANS 'bash' SANS EN COMPRENDRE COMPLÈTEMENT LES RÉSULTATS...
J'espère que cela aidera à éliminer certains blocages :)
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.