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 № 1Algo 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