Renomeia arquivos com base no nome da pasta

2

Eu tenho muitos arquivos index.html em pastas exclusivas nomeadas (uma por pasta). Desejo renomear cada arquivo com o nome da pasta pai.

De:

/folder1/index.html
/folder2/index.html
/folder3/index.html
/folder4/index.html
/folder5/index.html

Para:

/folder1/folder1.html
/folder2/folder2.html
/folder3/folder3.html
/folder4/folder4.html
/folder5/folder5.html

Tentativa 1

Eu tentei rename -vn 's:(/[^/]*)/[^/]*$:$1$1.html:' folder/*/*.html , que retorna com:

Using expression: sub { use feature ':5.18'; s:(/[^/]*)/[^/]*$:$1$1.html: }
'folder/*/*.html' unchanged

Eu realmente não entendo o que está acontecendo para consertar isso.

Tentativa 2

Em seguida, tentei rename -n -v '...' folder/*/*.html , que retornou com:

Using expression: sub { use feature ':5.18'; ... }
Unimplemented at (eval 2) line 1.

Estou usando o OSX com renomear instalado.

    
por evolutionxbox 29.05.2015 / 11:44

2 respostas

1

Isso funciona para mim:

rename -vn 's/([^\/]+)\/index/$1\/$1/' folder*/*.html

Impressões:

folder1/index.html renamed as folder1/folder1.html
folder2/index.html renamed as folder2/folder2.html
folder3/index.html renamed as folder3/folder3.html
folder4/index.html renamed as folder4/folder4.html
folder5/index.html renamed as folder5/folder5.html

Outra solução com sed :

ls -1 folder*/*.html | sed 's/\([^\/]\+\)\/index.html/mv "
mv "folder1/index.html" "folder1/folder1.html"
mv "folder2/index.html" "folder2/folder2.html"
mv "folder3/index.html" "folder3/folder3.html"
mv "folder4/index.html" "folder4/folder4.html"
mv "folder5/index.html" "folder5/folder5.html"
" "\/.html"/'

Impressões:

ls -1 folder*/*.html | sed 's/\([^\/]\+\)\/index.html/mv "
rename -vn 's/([^\/]+)\/index/$1\/$1/' folder*/*.html
" "\/.html"/' | bash

Se isso imprimir os comandos corretos, canalize-o para bash . Mas primeiro certifique-se de que os comandos impressos funcionem antes de executá-lo:

folder1/index.html renamed as folder1/folder1.html
folder2/index.html renamed as folder2/folder2.html
folder3/index.html renamed as folder3/folder3.html
folder4/index.html renamed as folder4/folder4.html
folder5/index.html renamed as folder5/folder5.html
    
por 29.05.2015 / 12:02
0

você pode tentar algo como:

for in in 'find . -name index.html -type f'
do
bname=$(dirname $i|sed 's:/::g')
mv $i $(dirname $i)/${bname}.html
done

P.S. isso funcionará apenas com um nível de diretórios e arquivos com extensão .html

    
por 29.05.2015 / 12:00