/ / Bash renomeia zips em subdiretórios - bash, rename, loops, mv

Bash renomeia zips em subdiretórios - bash, rename, loops, mv

Oi tem um monte de pastas com um arquivo zip nele os caminhos se parecem com isso

/folder/subfolder/archive.zip
/folder/subfolder1/archive1.zip
/folder/subfolder2/archive2.zip
/folder/subfolder3/zip3.zip
/folder/subfolder4/zip4.zip
etc...

Eu preciso que o posto seja assim

/folder/subfolder/preview.zip
/folder/subfolder1/preview.zip
/folder/subfolder2/preview.zip
/folder/subfolder3/preview.zip
/folder/subfolder4/preview.zip
etc...

Cada pasta também só tem um zip nele, então eunão tenho que trabalhar sobre sobrescrever e não o que eu preciso apenas de cada zip em cada pasta renomeada para preview.zip não importa o nome em cada subdiretório como posso fazer isso no bash?

Obrigado por qualquer ajuda

Respostas:

4 para resposta № 1

Algo como isso deveria fazer o trabalho:

for j in **/*.zip; do mv "$j" "${j%/*.zip}/preview.zip"; done

Como apontado por SiegeX, note que para usar globalização recursiva você tem que definir o globstar opção e que só está disponível no bash 4.x


3 para resposta № 2

Você pode fazer isso com a substituição de parâmetro do Bash:

bash-3.2$ for archive in folder/subfolder*/*.zip; do
echo "Archive = ${archive}, Preview = ${archive%/*}/preview.zip"
done
Archive = folder/subfolder/archive.zip, Preview = folder/subfolder/preview.zip
Archive = folder/subfolder1/archive1.zip, Preview = folder/subfolder1/preview.zip
Archive = folder/subfolder2/archive2.zip, Preview = folder/subfolder2/preview.zip
Archive = folder/subfolder3/zip3.zip, Preview = folder/subfolder3/preview.zip
Archive = folder/subfolder4/zip4.zip, Preview = folder/subfolder4/preview.zip

Onde ${archive%/*} vai tirar tudo do último / dentro ${archive}.

Isso permitirá que você verifique o comando que será executado. Altere isso para:

mv "${archive}" "${archive%/*}/preview.zip"

... para renomear os arquivos (mesmo se eles tiverem espaços em branco em seus nomes).


0 para resposta № 3

Isso pode funcionar para você, mas não foi totalmente testado:

find /folder -maxdepth 1 -mindepth 1 -type d -exec mv {}/archive*.zip {}/preview.zip ;

Trabalhando muito estritamente sob o seu exemplo, este devemos find todos os diretórios sob /folder, com uma profundidade máxima e mínima de 1 (ou seja, apenas diretórios dentro /folder, desde que parece ser o que você quer) e executa um mv comando para um arquivo sob cada.


0 para a resposta № 4
#!/bin/bash
while read file; do
echo mv "$file" "${file%/*}/preview.zip"
done < <(find /folder -type f -name "archive*.zip")

Nota</ strong>: Remova o echo se a saída parece suficiente e execute novamente o script para fazer as alterações reais