J'ai ce type d'arborescence de répertoires qui est obtenu en décompressant un fichier zip:
x -> y -> z -> run -> FICHIERS ET RÉPERTOIRES ICI
Il y a donc 4 répertoires, dont 3 sont vides de fichiers (x, y, z) et ne contiennent qu'un seul sous-répertoire, et il y a le répertoire qui m'intéresse, nommé " run ".
Je veux déplacer le répertoire "run" lui-même (y compris tout ce qu'il contient) à l'emplacement "root" où j'ai décompressé (c'est-à-dire où "x" est, mais pas à l'intérieur de "x").
Hypothèses: Il existe un dossier nommé "run", mais je ne sais pas combien de répertoires je devrai "cd" pour y accéder (peut être 3 (x, y, z), peut être 10 ou plus. Les noms sont également inconnus et ne doivent pas nécessairement être x, y, z, etc.).
Comment puis-je accomplir cela? J'ai essayé de nombreuses variantes de cette question, mais elles ont toutes échoué.
Réponses:
qu'en est-il de
où
(sur une note latérale, il y a une
--junk-paths
option dans zip, que ce soit lors du zip ou du dézippage)la source
Je le ferais en
bash
utilisantglobstar
. Comme expliqué dansman bash
:Ainsi, pour déplacer le répertoire
run
vers le répertoire de niveau supérieurx
, puis supprimer le reste, vous pouvez faire:La
shopt
commande active l'globstar
option. Lemv x/**/run/ x/
déplacera tous les sous-répertoires nommésrun
(notez que cela ne fonctionne que s'il n'y a qu'un seulrun
répertoire) dansx
etfind
supprimera tous les répertoires vides.Vous pouvez faire tout cela dans le shell avec un globbing étendu, si vous le souhaitez, mais je préfère le filet de sécurité de
find -empty
pour être sûr qu'aucun répertoire non vide n'est supprimé. Si cela vous est égal, vous pouvez utiliser:la source
Certainement plus verbeux, mais faire le travail en une seule étape:
En supposant que vous avez installé python
Comment utiliser
get_folder.py
Exécutez-le avec le répertoire racine (contenant vos fichiers décompressés) et le nom du dossier à "soulever" comme arguments:
Et c'est fait:
la source
Solution Perl
La façon dont cela fonctionne est simple: le
find()
sous-programme parcourt récursivement l'arborescence de répertoires donnée, trouve le répertoire dont le nom estrun
et le pousse dans un tableau de noms de fichiers souhaités. Dans ce cas, nous supposons qu'il ne devrait y avoir qu'un seul fichier dans la liste, donc une fois la commande terminée, nous utilisons àdirmove()
partir duFile::Copy::Recursive
module et le déplaçons dans le répertoire de travail actuel à partir duquel le script a été appelé. Ainsi, dans votre cas, vous l'appelleriez du répertoire parent versx
.Arborescence de répertoires d'origine:
Résultat:
la source