2 votes

commande shell pour supprimer tous les répertoires contenant un fichier __init__.py vide

Je cherche une commande pour l'interpréteur de commandes de Linux, qui supprimera récursivement tous les répertoires contenant juste vide __init__.py et/ou d'autres répertoires vides. Par conséquent, si un fichier de ce répertoire contient effectivement au moins un octet, il ne doit pas être supprimé.

En d'autres termes, supprimez tous les modules python vides de manière récursive. Veuillez noter que si le répertoire contient autre chose que des modules init .py - il ne doit pas être supprimé.

Ce que j'ai trouvé/essayé jusqu'à présent, c'est.. :

find . -type d -empty -delete

Et

find .  -type d -size -5k -delete

Et

find .  -type d -size 0 -delete

La première supprime les répertoires sans fichiers (dans mon exemple, ils contiennent des fichiers vides). init .py.

La seconde capture en quelque sorte tous les répertoires.

La troisième ne capture rien

1voto

John Kugelman Points 108754

Il peut être possible de le faire avec un seul système compliqué. find mais il est plus facile à gérer si vous le divisez en plusieurs étapes :

  1. Supprimer le vide __init__.py des dossiers.
  2. Supprimer les répertoires vides.

Si vous le faites de bas en haut en utilisant -depth il supprimera naturellement les répertoires ne contenant que des fichiers init vides et/ou des répertoires vides imbriqués.

find -depth '(' -type d -o -name __init__.py ')' -print0 |
    while IFS= read -d '' -r path; do
        [[ -f $path && ! -s $path ]] && (($(ls -A1 "$(dirname "$path")" | wc -l) == 1)) && rm "$path"
        rmdir "$path" 2> /dev/null || :
    done 

Les étapes :

  1. Utilice -depth de traiter les enfants avant les parents.
  2. Trouver des répertoires et des __init__.py s.
  3. Traiter chaque correspondance dans une boucle. -print0 s'associe à read -d '' pour s'assurer que nous gérons correctement les chemins d'accès contenant des espaces et des nouvelles lignes.
  4. Les seuls fichiers que nous avons fait correspondre sont les suivants __init__.py Así que [[ -f && ! -s ]] correspond à des fichiers init vides. (($(ls -A1 "$(dirname "$path")" | wc -l) == 1)) vérifie que le fichier init est le seul dans son répertoire. Si les deux conditions sont remplies, le fichier init est supprimé.
  5. Essayez de rmdir le chemin. S'il s'agit d'un répertoire vide, il sera supprimé. S'il s'agit d'un fichier ou d'un répertoire non vide, il ne le sera pas. Ce n'est pas grave : les erreurs sont supprimées avec 2> /dev/null . || : ignore le code de sortie qui a échoué, ce qui permet d'exécuter ce script en toute sécurité avec set -e .

0voto

element4lifex8 Points 13

On dirait que vous avez déjà appris à supprimer des répertoires vides avec votre première commande find. Pour supprimer les répertoires contenant des fichiers vides, vous pouvez utiliser :

find . -size 0 -exec dirname {} + | xargs rm -rf

Ici, la commande find récupère le nom de chaque répertoire contenant des fichiers vides, puis tous les noms de répertoires sont transmis à xargs qui les supprime.

Si vous avez d'autres fichiers que __init.py__ qui peuvent être vides, vous pouvez alors spécifier directement que seuls les fichiers de 0 octet nommés __init.py__ correspondent à la commande find :

find . -size 0 -and -name "__init.py__" -exec dirname {} + | xargs rm -rf

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X