J'ai cette structure de dossiers:
├── foo1
│ ├── bar1.txt
│ └── bar2.txt
├── foo2
│ ├── bar3.txt
│ └── bar4 with a space.txt
└── foo3
└── qux1
├── bar5.txt
└── bar6.txt
que je voudrais aplatir en ceci, avec un trait de soulignement entre chaque niveau de dossier:
├── foo1_bar1.txt
├── foo1_bar2.txt
├── foo2_bar3.txt
├── foo2_bar4 with a space.txt
├── foo3_qux1.bar6.txt
└── foo3_qux1_bar5.txt
J'ai regardé autour de moi et je n'ai trouvé aucune solution qui fonctionne, principalement parce que mon problème a deux particularités: il peut y avoir plus d'un niveau de dossier à l'intérieur de la racine et aussi parce que certains fichiers peuvent avoir des espaces.
Une idée de comment accomplir cela en bash? Merci!
Edit : Running gleen jackman a proposé la réponse que j'obtiens:
Il existe deux traits de soulignement pour le dossier de premier niveau. Avez-vous une idée de comment éviter cela ou simplement le renommer afin que ce ne soit qu'un seul trait de soulignement? Merci.
la source
foo1__qux1_bar5.txt
, deux soulignements dans le premier niveau de dossier qui est. J'ai essayé de jouer avec votre ligne bash mais rien ne semblait fonctionner. Peut-être que je dois ajouter quelque chose?"${file//\//_}"
pour"${file//+(/)/_
, et s'il s'agit d'un script,shopt -s extglob
brew install findutils
puis en utilisantgfind
au lieu defind
. Cela a fonctionné pour moi.Utiliser le renommage de Perl:
PRODUCTION
REMARQUE
(?<!\.)
pour ne pas toucher le premier./
Je garde les répertoires vides, n'hésitez pas à:
find . -depth -type d -exec rm {} \;
Il existe d'autres outils du même nom qui peuvent ou non être en mesure de le faire, alors soyez prudent.
Si vous exécutez la commande suivante (
GNU
)et vous avez un résultat comme
et ne contenant pas:
alors cela semble être le bon outil =)
Sinon, pour en faire la valeur par défaut (généralement déjà le cas) sur
Debian
et dérivé commeUbuntu
:(remplacez
/path/to/rename
le chemin de votreperl's rename
commande.Si vous n'avez pas cette commande, recherchez dans votre gestionnaire de paquets pour l'installer ou faites-le manuellement
Enfin, cet outil a été écrit à l'origine par Larry Wall, le père de Perl.
la source
-type d -exec rmdir
...?perl-rename
dans Arch Linux etprename
dans les systèmes basés sur Debian.rename
Explications ajoutéesavec
pax
...Cela créera un lien physique dans le répertoire actuel vers tous les fichiers de ses répertoires enfants avec un
_
substitué pour/
. Vous pouvez ensuite inspecter les résultats et supprimer tous les répertoires enfants avec ...... une fois que vous avez vérifié que les résultats sont à votre goût.
la source
Vous pouvez essayer avec la commande ci-dessous.
La commande ci-dessus déplacera les fichiers et le répertoire restera, qui pourra être supprimé ultérieurement.
la source