Encontre e renomeie os arquivos adicionando parte do caminho ao nome do arquivo

4

Eu tenho uma pasta com dois níveis de subpastas dentro dela. Dentro da segunda subpasta, há um arquivo jpg. Todo o jpg tem o mesmo nome: cover.jpg

Exemplo:

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

Eu preciso encontrar (e copiar para uma nova pasta) todos os arquivos cover.jpg e renomeá-los adicionando ao seu nome de arquivo (como prefixo) o nome da primeira e segunda subpasta.

Exemplo:
Após a operação pretendida, o conteúdo ot /home/user1/newfolder deve ser:

folder001_folderAAA_cover.jpg
folder002_folderBBB_cover.jpg
[...]
folder999_folderZZZ_cover.jpg
    
por user68563 26.05.2014 / 00:21

3 respostas

2
#! /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

Remova o echo se ele fizer o que você deseja.

    
por 26.05.2014 / 00:36
2

Em zsh, coloque autoload zmv no seu .zshrc ( ou execute esse em sua linha de comando para experimentar com ele), então:

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

Cada arquivo que corresponde ao padrão no lado esquerdo é renomeado para o texto de substituição no lado direito. * significa “qualquer sequência de caracteres”. No lado direito, ${1} , ${2} e ${3} são substituídos, respectivamente, pela porção do caminho de origem correspondida pelo primeiro, segundo e terceiro grupos de parênteses no padrão.

Em vez de usar o agrupamento explícito, você pode solicitar que cada caractere curinga seja criado automaticamente:

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

Ou até mesmo:

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

Alguns até chegam a adicionar:

alias zmmv='noglob zmv -W'

para lá ~/.zshrc para poder escrever:

zmmv /home/user/*/*/cover.jpg /home/user1/newfolder/*_*_cover.jpg
    
por 27.05.2014 / 02:43
1

Isso pode ser facilmente obtido com a ajuda do comando sed. Encontre a lista de arquivos que precisam ser renomeados e, com o sed / echo do caminho do arquivo, podemos alcançar o requisito.

cd /home/user
for fl_nm in $(find . -type f -name "cover.jpg")
do
echo copying the file with desired 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 os arquivos com o nome cover.jpg serão copiados para / home / user1 / newfolder     com o nome do arquivo com os respectivos detalhes da pasta no nome do arquivo.

    
por 02.01.2017 / 12:09