8
votes

Renommez des fichiers avec .jpg Extension en fonction de son nom de dossier via Bash Script

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


2 commentaires

Ê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.


4 Réponses :


1
votes

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


1 commentaires

N'utilisez pas de pour en boucle à itérer sur la sortie d'un programme qui génère des noms de fichiers. Utilisez un en lecture boucle ou xargs . Les noms de fichiers avec des espaces vont casser le pour boucle. Vous devez également toujours citer des variables contenant des noms de fichiers.



3
votes
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"

0 commentaires

2
votes

Une solution basée sur des fonctions de bash natifs (bien, sauf trouve, alors ;-)) xxx


2 commentaires

Cela échouera pour les noms de fichiers contenant des espaces. Vous devez utiliser un en lecture en boucle au lieu d'un pour 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 serait mieux!



3
votes
#!/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.

0 commentaires