Je dois garder tout le répertoire qui contient des fichiers dans un sous-répertoire spécifique mais pour supprimer reste tous les répertoires dans lesquels le sous-répertoire est vide.
Pour être plus précis, voici la structure:
A
|
|--------312311
| |
| |----Recording
| |----a.txt
| |----b.txt
|
|
|--------453453
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------566532
| |----Recording
| |----a.txt
| |----b.txt
Les sous-répertoires peuvent ou non contenir un fichier. Je dois donc supprimer tout le répertoire comme '312311' et '566532' et seulement '453453' devrait rester avec toutes les données car il a un fichier dans le dossier 'Recording' qui est un répertoire spécifique pour moi.
J'ai vu de nombreux messages, mais il renvoie à de nombreux noms de fichiers spécifiques. Toute aide sera très appréciée car je dois le faire plusieurs fois par semaine.
command-line
directory
find
Derek James
la source
la source
Réponses:
Le script ci-dessous fera exactement ce que vous décrivez, il:
Recherche dans chacun des dossiers un dossier nommé "Enregistrement"
Dans une image:
aura pour résultat:
Le scénario
Utiliser
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:
C'est ça.
Explication
Alimenter le contenu de votre dossier "A" dans le script,
listera ses sous-répertoires (et fichiers). Puis:
va essayer de lister le contenu de chacun des (sous-) dossiers, ce qui déclenchera une erreur si l'élément est un fichier:
ou si le dossier "Enregistrement" n'existe pas du tout:
Si le dossier "Enregistrement" existe et est vide, le dossier supérieur est supprimé:
ÉDITER
En outre, comme demandé dans les commentaires, une version qui vérifiera plusieurs sous-répertoires (noms).
Dans le cas où le répertoire contient l' un des sous-répertoires (non vides) répertoriés, le répertoire est conservé. Sinon, il sera supprimé.
Utiliser
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:
C'est ça.
Le scénario
Remarque
Veuillez d'abord exécuter sur un répertoire de test pour vous assurer qu'il fait exactement ce que vous voulez.
la source
Utilisation de
find
etxargs
:(supprimez le
echo
une fois que vous êtes sûr qu'il identifie les bons répertoires). Laprintf '%h\0
partie imprime le répertoire parent (terminé par null) - à partir deman find
:Ex.: Donné
puis
la source
[\d]*
?Voici une solution bash plus simple:
Cela fonctionne car
rmdir
échouera si le répertoire n'est pas vide, et&&
empêchera l'rm -r
exécution de à moins qu'ilrmdir
réussisse. Le glob*/
s'assure que vous ne travaillez que sur les répertoires, donc les autres fichiers ne seront pas affectés.la source