Buscar y renombrar files agregando parte de la ruta al nombre de file

Tengo una carpeta con dos subcarpetas dentro de ella. Dentro de la segunda subcarpeta, hay un file jpg. Todos los jpg tienen el mismo nombre: cover.jpg

Ejemplo:

 /home/user/folder001/folderAAA/cover.jpg /home/user/folder002/folderBBB/cover.jpg [...] /home/user/folder999/folderZZZ/cover.jpg 

Necesito encontrar (y copyr en una nueva carpeta) todos los files cover.jpg y cambiarles el nombre agregando a su nombre de file (como prefijo) el nombre de la primera y la segunda subcarpetas.

Ejemplo:
Después de la operación prevista, el contenido de /home/user1/newfolder debe ser:

 folder001_folderAAA_cover.jpg folder002_folderBBB_cover.jpg [...] folder999_folderZZZ_cover.jpg 

 #! /bin/bash target_dir_path="/copy/here" for file in folder*/*/*.jpg; do l1="${file%%/*}" l2="${file#*/}" l2="${l2%%/*}" filename="${file##*/}" target_file_name="${l1}_${l2}_${filename}" echo cp "$file" "${target_dir_path}/${target_file_name}" done 

Elimina el echo si hace lo que quieres.

En zsh, coloca autoload zmv en tu .zshrc (o ejecuta ese en tu línea de command para experimentar con él), entonces:

 mkdir /home/user1/newfolder zmv '/home/user/(*)/(*)/(cover.jpg)' '/home/user1/newfolder/${1}_${2}_${3}' 

Cada file que coincide con el patrón en el lado izquierdo se renombra al text de reemploop en el lado derecho. * significa "cualquier secuencia de caracteres". En el lado derecho, ${1} , ${2} y ${3} se reemplazan respectivamente por la parte de la ruta de origen coincidente con el primer, segundo y tercer grupo entre paréntesis en el patrón.

En lugar de utilizar la agrupación explícita, puede solicitar que cada comodín se convierta automáticamente en un grupo propio:

 zmv -w '/home/user/*/*/cover.jpg' '/home/user1/newfolder/${1}_${2}_cover.jpg' 

O incluso:

 zmv -W '/home/user/*/*/cover.jpg' '/home/user1/newfolder/*_*_cover.jpg' 

Algunos incluso llegan tan lejos como para agregar:

 alias zmmv='noglob zmv -W' 

hasta allí ~/.zshrc para poder escribir:

 zmmv /home/user/*/*/cover.jpg /home/user1/newfolder/*_*_cover.jpg 

Esto se puede lograr fácilmente con la ayuda del command sed. Encuentre la list de files que necesita ser renombrada y con sed / echo of file path podemos lograr el requerimiento.

 cd /home/user for fl_nm in $(find . -type f -name "cover.jpg") do echo copying the file with desinetworking name to new folder : $fl_nm cp $fl_nm /home/user1/newfolder/$(echo ${i#*/*} | sed 's/\//_/g') #Above copy command ignores the find result which extracts only file path from ./**file_path** done 

Todos los files con el nombre cover.jpg se copyrán en / home / user1 / newfolder con el nombre del file con los detalles de la carpeta correspondiente en el nombre del file.