J'ai un tas de dossiers et je veux parcourir tous ces dossiers et dans chaque dossier créer un autre dossier nommé "Photo"
F1
--F11
----F111
----F112
--F12
Je veux avoir:
F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo
command-line
mkdir
OOzy Pal
la source
la source
ls
n'est pas analysé. C'est juste une rétroaction à l'utilisateur ... montrant ce qui se passe. Tout comme les mots "Ceci est un répertoire de photos". C'est faire savoir à l'utilisateur pourquoi il n'y crée pas de répertoire.find -type d F1
, peut être?$i/Photo
, mais l'OP n'a pas spécifié ce qui doit être fait dans un tel cas. Il échouera également dans le cas, certes peu probable, où l'un des$i
s contient une nouvelle ligne.Vous pouvez y parvenir en utilisant un seul
find
appel.La partie
-name 'Photo' -prune -o
indique de ne pas récuser dans lesPhoto
répertoires existants (et nouvellement créés) : Si le fichier (ou répertoire) trouvé a le nomPhoto
, arrêtez de le traiter (-prune
). Dans l'autre cas (-o
), continuez avec directory (-type d
) et exécutez (-exec
) la commande.la source
-prune
? :) Oui, c'est assez contre-intuitif mais ça vaut le coup d'être appris.-type d
avec-name 'Photo'
avant-prune
.find
continuera avec d'autres dossiers (y compris les sous-dossiers de ce dossier, si vous le demandez).Vous pouvez passer les
find
résultats à lawhile
place defor
car de cette façon, il ne se cassera pas si les noms de fichiers ont des espacesCd dans le répertoire
F1
, puis faites:Si le répertoire existe,
mkdir
refusera simplement de le créer, donc pas de problème là-bas ...Si les noms de vos répertoires peuvent contenir des sauts de ligne ou d'autres étrangetés exotiques, utilisez ceci qui peut traiter des noms arbitraires:
Merci à @terdon pour son aide :)
la source
F1
répertoire de l'op est~user/Pictures
, le déplacement vers le répertoire parent et l'exécution de la ligne mettront unPhoto
répertoire dans chaque répertoire de son espace, qui pourrait être des milliers. Pensez à ajouter leF1
dans le cadre de la ligne de communication pour éviter une erreur facilement commise. De cette façon, s'il est exécuté par inadvertance au mauvais endroit, il ne créera pas de répertoires.F1
place, édité @LDJamesPython avec
os.walk
peut le faire assez facilement et en seulement quelques lignes de codeExplication
Nous avons affaire à cette commande: python -c 'import os; [os.mkdir (r + "/ Pictures") pour r, d, f dans os.walk (".")]'
Ici, nous appelons simplement l'interpréteur python avec
-c
flag pour spécifier la commande que nous donnons entre guillemets simples.os.walk()
La fonction nous permet de parcourir récursivement tous les sous-répertoires et pour chaque sous-répertoire (représenté parr
), nous créons un dossier Images via laos.mkdir()
fonction.r+"/Pictures"
est juste une simple manipulation de chaîne pour joindre la chaîne de sous-répertoire et la chaîne "/ Pictures" pour former un seul cheminRemplacez "/ Pictures" par "/ Photo" pour répondre à vos besoins
la source
Si vous utilisez bash, vous pouvez simplement exécuter:
L'
globstar
option fait**
correspondre "tous les fichiers et 0 ou plusieurs répertoires et sous-répertoires". En d'autres termes, il correspond à tout de manière récursive. En raison de la/
fin,**/
correspondra à tous les répertoires et sous-répertoires (pas de fichiers). Par conséquent, le$d
itérera sur tous les répertoires du répertoire actuel et leurs sous-répertoires et lePhotos
répertoire sera créé dans chacun d'eux.Le
-p
drapeau desmkdir
moyens:Ici, je l'utilise simplement pour supprimer les messages d'erreur si le répertoire cible existe déjà. Supprimez-le si vous souhaitez voir les erreurs.
Notez que cela ne permettra pas de créer un
Photo
sous - répertoire dans un répertoire cible qui contient un fichier nommé Photo. Cependant, vous n'avez pas spécifié ce qui devrait être fait dans ces cas et toutes les autres réponses publiées jusqu'à présent ont également cette limitation.la source