Je dois conserver tous les répertoires contenant des fichiers dans un sous-répertoire spécifique, mais supprimer tous les répertoires dans lesquels le sous-répertoire est vide.
Pour être plus précis, voici la structure :
A||--------312311| || |----Enregistrement| |----a.txt| |----b.txt|||--------453453| |----Enregistrement| || |-------a.mp3| |----a.txt| |----b.txt|||--------566532| |----Enregistrement| |----a.txt| |----b.txt
Les sous-répertoires peuvent ou non contenir un fichier. Je dois donc supprimer tout le répertoire comme '312311' &'566532' et seul '453453' doit rester avec toutes les données car il contient un fichier dans le dossier 'Recording' qui est un répertoire spécifique pour moi.
J'ai vu de nombreux messages, mais il contient des liens vers de nombreux noms de fichiers spécifiques. Toute aide sera très appréciée car je dois le faire plusieurs fois par semaine.
Réponse acceptée :
Le script ci-dessous fera exactement ce que vous décrivez :
- répertorie les dossiers à l'intérieur d'un répertoire
-
Recherche dans chacun des dossiers un dossier nommé "Enregistrement"
- S'il existe et est vide, il supprime son dossier supérieur
- si ce n'est pas existe, il supprime également son dossier supérieur
- fichiers au premier niveau à l'intérieur de A ne sera pas supprimé.
Dans une image :
A||--------123456| || |----Enregistrement| |----a.txt| |----b.txt|||--------635623| |----Enregistrement| || |-------a.mp3| |----a.txt| |----b.txt|||--------123456| |----Enregistrement| |----a.txt| |----b.txt||--------Singe.txt
entraînera :
A|||--------635623| |----Enregistrement| || |-------a.mp3| |----a.txt| |----b.txt|||--------Monkey.txt
Le scénario
#!/usr/bin/env python3import osimport sysimport shutdown =sys.argv[1]def path(*args):return os.path.join(*args)for d in os.listdir(dr ):essayez:sinon os.listdir(path(dr, d, "Recording")):shutdown.rmtree(path(dr,d)) except FileNotFoundError:shutdown.rmtree(path(dr,d)) except NotADirectoryError:passer
À utiliser
- Copiez le script dans un fichier vide, enregistrez-le sous
delete_empty.py
-
Exécutez-le avec le répertoire (complet !) (contenant vos sous-répertoires, A dans votre exemple) comme argument par la commande :
python3 /path/to/delete_empty.py /path/to/directory
C'est tout.
Explication
Envoyant le contenu de votre dossier "A" au script,
os.listdir(dr)
listera ses sous-répertoires (et fichiers). Ensuite :
si ce n'est pas os.listdir(chemin(dr, d, "Enregistrement"))
essaiera de lister le contenu de chacun des (sous)dossiers, ce qui déclenchera une erreur si l'élément est un fichier :
sauf pass NotADirectoryError
ou si le dossier "Enregistrement" n'existe pas du tout :
FileNotFoundError shutdown.rmtree(path(dr,d))
Si le dossier "Enregistrement" existe et est vide, le dossier supérieur est supprimé :
si ce n'est pas os.listdir(path(dr, d, "Recording")):shutdown.rmtree(path(dr,d))
MODIFIER
De plus, comme demandé dans les commentaires, une version qui vérifiera plusieurs sous-répertoires (noms).
Si le répertoire contient tout des sous-répertoires listés (non vides), le répertoire est conservé. Sinon, il sera supprimé.
À utiliser
- Copiez le script dans un fichier vide, enregistrez-le sous
delete_empty.py
-
Exécutez-le avec le répertoire (complet !) (contenant vos sous-répertoires, A dans votre exemple) et les noms des sous-répertoires comme arguments par la commande :
python3 /path/to/delete_empty.py /path/to/directory
C'est tout.
Connexe :Que fait « sudo echo nameserver 8.8.8.8> /etc/resolv.conf » ?Le scénario
#!/usr/bin/env python3import shutdownimport osimport sysdr =sys.argv[1]; matches =sys.argv[2:]def path(*args):return os.path.join(*args)for d in os.listdir(dr):# delete directory *sauf si* l'un des sous-répertoires répertoriés contient des fichiers keep =False # vérifie pour chacun des sous-répertoires répertoriés (noms) le nom dans les correspondances :try:if os.listdir(path(dr, d, name)):keep =True break except NotADirectoryError :# si l'élément n'est pas un dir, aucun autre nom à vérifier keep =True break sauf FileNotFoundError :# si le nom (sous-répertoire) n'existe pas, vérifier la prochaine passe s'il n'est pas conservé :# s'il n'y a aucune raison de conserver --> supprimer shutdown. rmtree(chemin(dr,d))
Remarque
Veuillez d'abord exécuter un répertoire de test pour vous assurer qu'il fait exactement ce que vous voulez.