/ / Bash renommer les zips dans les sous-répertoires - bash, renommer, boucles, mv

Bash renomme les zips dans les sous-répertoires - bash, rename, loops, mv

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

Quelque 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

${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