/ / Renommer des fichiers en réordonnant le modèle dans bash - bash, renommer

Renommer des fichiers en réordonnant le modèle dans bash - bash, renommer

J'ai un fichier pdf au format:

Author-YYYY-rest_of_text_seperated_by_underscores.pdf
John-2010-some_file.pdf
Smith-2009-some_other_file.pdf

Je dois renommer les fichiers pour que l'année soit la première, par exemple.

YYYY-Author-rest_of_text_seperated_by_underscores.pdf
2010-John-some_file.pdf
2009-Smith-some_other_file.pdf

Cela impliquerait donc de déplacer l'élément "AAAA" au début.

Je n'ai pas unix "Rename" et dois me fier à sed, awk, etc. Je suis heureux de renommer inplace.

J'ai essayé d'adapter cette réponse, n'ayant pas beaucoup de chance. Utilisation de sed pour renommer en masse des fichiers

Réponses:

4 pour la réponse № 1

Voir BashFAQ # 100 pour des conseils généraux sur la manipulation des cordes avec bash. Une des techniques utilisées est extension des paramètres, qui est fortement utilisé ci-dessous:

pat=-[0-9][0-9][0-9][0-9]-
for f in *$pat*; do  # expansion not quoted here to expand the glob
prefix=${f%%$pat*} # strip first instance of the pattern and everything after -> prefix
suffix=${f#*$pat}  # strip first instance and everything before -> suffix
year=${f#"$prefix"}; year=${year%"$suffix"} # find the matched year itself
mv -- "$f" "${year}-${prefix}-${suffix}"    # ...and move.
done

Au fait, BashFAQ # 30 discute de nombreux mécanismes de renommage, dont l’un en utilisant sed pour exécuter des transformations arbitraires.


3 pour la réponse № 2

Utilisation de regex BASH:

re="^([^-]+-)([0-9]{4}-)(.*)$"

for f in *.pdf; do
[[ $f =~ $re ]] &&
echo mv "$f" "${BASH_REMATCH[2]}${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
done

Lorsque vous êtes satisfait de la sortie, supprimez echo commande avant mv.