Renomeia arquivos em subpastas com nomes de pastas pai

1

Eu tenho um diretório principal que tem quatro pastas f1, f2, f3 and f4 cada uma dessas pastas tem 10 pastas, e cada uma dessas 10 pastas ff1...ff10 tem algumas .jpeg imagens com alguns nomes, digamos image1 .... e assim por diante. O que eu quero saber é como renomear essas imagens .jpeg em cada uma dessas pastas das 10 pastas em cada uma das f1, f2, f3 and f4 , para que eu concatene as pastas pai no início de seu nome, por exemplo de image1.jpeg está localizado em f3/ff1 , então seu nome será f3_ff1_image1.jpeg , o mesmo com todas as outras imagens nas outras 10 pastas em cada uma das quatro pastas principais. Se alguém puder, por favor, informe como isso pode ser feito em um arquivo .sh .

    
por Tak 28.09.2014 / 18:24

2 respostas

2

Crie um arquivo simples changeName.sh da seguinte forma:

    #!/bin/bash
    fileName=$(basename $1)
    filepath=$(dirname $1)
    secondDir=$(basename $filepath)
    firstDir=$(basename $(dirname $filepath))
    parentDir=$(basename $(dirname $(dirname $filepath)))
    mv $1 $filepath/${parentDir}_${firstDir}_${secondDir}_$fileName

salve-o, por exemplo, em /home/yourUser/bin .

Alterar permissão para changeName.sh :

chmod +x /home/yourUser/bin/changeName.sh

Abra o arquivo /home/yourUser/.bashrc e adicione no final desta linha:

PATH=$PATH:/home/yourUser/bin

salve e recarregue:

source .bashrc

Agora você tem um novo utilitário que pode alterar o nome para o arquivo usando a pasta como parte do nome.

Tente isto:

find mainDirectory -name "*.jpeg" -exec changeName.sh {} \;

mainDirectory pode ser absoluto ou relativo.

Testado no lubuntu 12.04

dirname tira o último componente do nome do arquivo enquanto basename retira o diretório e o sufixo dos nomes dos arquivos.

Então, para obter o terceiro nível do diretório:

   parentDir=$(basename $(dirname $(dirname $filepath)))
    
por Lety 28.09.2014 / 19:34
4

Com um loop e algumas manipulações de string bash

while read -rd $'
shopt -s globstar
rename -nv -- 's|(f\d+)/(ff\d+)/(image\d+)|$1/$2/$1_$2_$3|' **/*.jpeg
' f; do d="${f%/*}"; p="${d/\//_}"; echo mv -- "$f" "${d}/${p}_${f##*/}" done < <(find -type f -name '*.jpeg' -printf '%P
while read -rd $'
shopt -s globstar
rename -nv -- 's|(f\d+)/(ff\d+)/(image\d+)|$1/$2/$1_$2_$3|' **/*.jpeg
' f; do d="${f%/*}"; p="${d/\//_}"; echo mv -- "$f" "${d}/${p}_${f##*/}" done < <(find -type f -name '*.jpeg' -printf '%P%pre%')
')

(remova o echo depois de confirmar que ele corresponde aos arquivos corretamente)

Com o comando rename baseado em perl e bash globstar

%pre%

(remova o -nv depois de confirmar que ele corresponde aos arquivos corretamente)

    
por steeldriver 28.09.2014 / 19:34