2017-10-19 25 views
0

J'ai essayé de trouver un moyen de renommer les noms de fichiers qui sont listés dans des dossiers imbriqués et j'ai un problème pour résoudre ce problème. En tant que test, j'ai été capable de découper la partie du nom que je voudrais modifier, mais je ne peux pas penser à la façon de mettre cela dans une variable et d'enchaîner le nom. le format de fichier ressemble à ceci.changer le nom du fichier dans les dossiers imbriqués

XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3 

i ont testé ce format sur pour couper la partie que je cherchais à changer, mais je ne suis pas sûr que ce serait la meilleure façon de le faire.

echo XXX_XXXX_AAAAAAAAAAAAAAAA_100426095135-all.mp3 | awk -F_ '{print $ 4}' | Je souhaite remplacer le format 100426151653 par le nom 20100426-151653.

J'ai essayé d'utiliser le renommer le fichier avec cette commande avec ce format 's/// g' mais ce format n'a pas fonctionné j'ai dû recourir à renommer le nom de fichier '' '' pour supprimer un espace vide.

de sorte que le fichier commencerait que ce XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3 et finir comme ça XXX_XXXX_YYYYYYYYYY_20100426-151653-all.mp3

+0

Préfixez votre code/données avec quatre espaces blancs. Veuillez jeter un coup d'œil à [edit-help] (http://stackoverflow.com/editing-help). – Cyrus

Répondre

0

Comment l'utilisation de trouver et une fonction bash

#!/bin/bash 

modfn() { 
    suffix=$2 
    fn=$(basename $1) 
    path=$(dirname $1) 

    fld1=$(echo $fn | cut -d '_' -f1) 
    fld2=$(echo $fn | cut -d '_' -f2) 
    fld3=$(echo $fn | cut -d '_' -f3) 
    fld4=$(echo $fn | cut -d '_' -f4) 
    fld5=${fld4%$suffix} 
    l5=${#fld5} 
    fld6=${fld5:0:$(($l5 - 6))} 
    fld7=${fld5:$(($l5 - 6)):6} 

    newfn="${fld1}_${fld2}_${fld3}_20${fld6}-${fld7}${suffix}" 

    echo "moving ${path}/${fn} to ${path}/${newfn}" 
    mv ${path}/${fn} ${path}/${newfn}" 
} 


export -f modfn 

suffix="-all.mp3" 
export suffix 

find . -type f -name "*${suffix}" ! -name "*-*${suffix}" -exec bash -c 'modfn "$0" ${suffix}' {} + 

Le ci-dessus script bas utilise find pour rechercher dans le dossier actuel et son contenu pour les fichiers comme WWW_XXXX_YYYYYYYYYY_AAAAAABBBBBB-all.mp3 encore exclud ceux qui sont déjà renommés et ressemblent à WWW_XXXX_YYYYYYYYYY_20AAAAAA-BBBBBB-all.mp3. W, X, Y, A, B peuvent être n'importe quel caractère autre que le trait de soulignement ou le tiret.

Tous les fichiers trouvés sont rebaptisés

NOTE: Il existe des moyens pour réduire le script ci-dessus mais cela qui rend l'opération moins évidente.

+0

J'ai démarré le programme et ça fonctionne comme vous l'avez dit. Eh bien, il y a deux problèmes. 1. il ne fait qu'un seul fichier à la fois. et la seconde est qu'il ne joue pas bien avec les fichiers imbriqués. Avez-vous des suggestions? – dreedy

0

Ce perl one-liner fait le travail:

find . -name "XXX_XXXX_YYYYYYYYYY_*-all.mp3" -printf '%P\n' 2>/dev/null | perl -nle '$o=$_; s/_[0-9]{6}/_20100426-/; $n=$_; rename($o,$n)if!-e$n' 

Note: Je suis venu juste avec une commande find et une partie de regex. Le crédit pour un doubleur perl va à l'utilisateur de perlmonks au http://www.perlmonks.org/?node=823355

+0

si je vois ce seul doublure correctement, il semble que le seul fonctionne des fichiers avec le nom de cette date _20100426. Je ne pense pas que cela fonctionnera pour les fichiers imbriqués de dates différentes. – dreedy