GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Supprimer le répertoire parent (non vide) si un répertoire enfant spécifique est vide ?

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 :

  1. répertorie les dossiers à l'intérieur d'un répertoire
  2. 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

  1. Copiez le script dans un fichier vide, enregistrez-le sous delete_empty.py
  2. 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

  1. Copiez le script dans un fichier vide, enregistrez-le sous delete_empty.py
  2. 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.


Ubuntu
  1. Supprimer un répertoire dans Ubuntu 20.04 - Meilleures méthodes

  2. Est-ce que 'rm .*' supprime jamais le répertoire parent ?

  3. Définir par défaut les nouveaux fichiers et dossiers enfants sur la propriété du dossier parent ?

  4. Quel est le moyen le plus sûr de vider un répertoire dans *nix ?

  5. Comment puis-je supprimer une nouvelle ligne si c'est le dernier caractère d'un fichier ?

Comment obtenir la taille d'un répertoire sous Linux

La commande Linux pwd

Comment supprimer un répertoire dans Ubuntu 20.04

Supprimer le répertoire sous Linux - Comment supprimer un dossier de la ligne de commande

Comment supprimer des fichiers et des répertoires à l'aide du terminal dans Debian 10

comment puis-je supprimer récursivement des répertoires vides dans mon répertoire personnel ?