Salut avoir un tas de dossiers avec un fichier zip dans les chemins ressemblent à ceci
/folder/subfolder/archive.zip
/folder/subfolder1/archive1.zip
/folder/subfolder2/archive2.zip
/folder/subfolder3/zip3.zip
/folder/subfolder4/zip4.zip
etc...
J'ai besoin de sortir pour être comme ça
/folder/subfolder/preview.zip
/folder/subfolder1/preview.zip
/folder/subfolder2/preview.zip
/folder/subfolder3/preview.zip
/folder/subfolder4/preview.zip
etc...
Chaque dossier contient également un seul zipne pas avoir à travailler sur le remplacement et ce que je n'ai pas besoin juste chaque zip dans chaque dossier renommé preview.zip, peu importe le nom dans chaque sous-répertoire, comment puis-je le faire en bash?
Merci pour toute aide
Réponses:
4 pour la réponse № 1Quelque chose comme ça devrait faire le travail:
for j in **/*.zip; do mv "$j" "${j%/*.zip}/preview.zip"; done
Comme l’a souligné SiegeX, notez que pour utiliser la suppression récursive, vous devez définir la globstar
option disponible uniquement dans bash 4.x
3 pour la réponse № 2
Vous pouvez le faire avec la substitution de paramètre de 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
Où ${archive%/*}
va tout enlever de la dernière /
dans ${archive}
.
Cela vous permettra de vérifier la commande à exécuter. Changer ceci pour:
mv "${archive}" "${archive%/*}/preview.zip"
... pour renommer les fichiers (même s'ils ont des espaces).
0 pour la réponse № 3
Cela pourrait fonctionner pour vous, mais ce n’est pas complètement testé:
find /folder -maxdepth 1 -mindepth 1 -type d -exec mv {}/archive*.zip {}/preview.zip ;
Travaillant très strictement sous votre exemple, cette devrait find
tous les répertoires sous /folder
, avec une profondeur maximale et minimale de 1 (c’est-à-dire uniquement les répertoires /folder
, puisque cela semble être ce que vous voulez) et exécute un mv
commande pour un fichier sous chacun.
0 pour la réponse № 4
#!/bin/bash
while read file; do
echo mv "$file" "${file%/*}/preview.zip"
done < <(find /folder -type f -name "archive*.zip")
Remarque</ strong>: Retirer le echo
si la sortie semble suffisante et réexécutez le script pour apporter les modifications réelles