J'ai le fichier .jpg dans mon dossier et ses sous-dossiers.
image/1/large/imagexyz.jpg image/1/medium/imageabc.jpg image/1/small/imagedef.jpg
4 Réponses :
Avez-vous voulu dire quelque chose comme ça?
for i in $(find image/ -type f); do mv $i $(echo $i | sed -r 's#image/([0-9]+)/([^/]+)/[^/]+.jpg#\2_\1.jpg#'); done
N'utilisez pas de pour code> en boucle à itérer sur la sortie d'un programme qui génère des noms de fichiers. Utilisez un
en lecture code> boucle ou
xargs code>. Les noms de fichiers avec des espaces vont casser le
pour code> boucle. Vous devez également toujours citer des variables contenant des noms de fichiers.
oldIFS="$IFS" IFS=/ while read -r -d $'\0' pathname; do # expect pathname to look like "image/1/large/file.name.jpg" set -- $pathname mv "$pathname" "$(dirname "$pathname")/${3}_${2}.jpg" done < <(find . -name \*.jpg -print0) IFS="$oldIFS"
Une solution basée sur des fonctions de bash natifs (bien, sauf trouve, alors ;-))
Cela échouera pour les noms de fichiers contenant des espaces. Vous devez utiliser un en lecture code> en boucle au lieu d'un
pour code> boucle.
Oui bien sûr; Mais ce n'était pas dans la description du problème. Jamais dit que c'était une solution générale :-) Mais oui, en lecture code> serait mieux!
#!/bin/sh find . -type f -name "*.$1" > list while read line do echo $line first=`echo $line | awk -F/ '{print $2}'` echo $first second=`echo $line | awk -F/ '{print $3}'` echo $second name=`echo $line | awk -F/ '{print $4}'` echo $name mv "./$first/$second/$name" ./$first/$second/${first}_${second}.$1 done < list If you save this file as rename.sh then run rename.sh jpg to replace jpg files and rename.sh png to replace png and so on.
Êtes-vous sûr de ne pas avoir d'autres fichiers à l'intérieur de 1 / grand? S'il y en a, vous renommez tous les fichiers avec un nom de fichier. Finalement, vous obtiendrez simplement 1 fichier, c'est-à-dire grand_1.jpg
Oui, je n'ai qu'un seul fichier JPG ou JPEG ou PNG à l'intérieur de 1 / grand dossier.