J'en ai presque fini avec le script mais cela génère des répertoires. Ce que j'aimerais, c'est avoir une sortie de fichiers. Quoi qu'il en soit, l'un de vous veut m'aider? :)
#!bin/bash
( find /testftp/* -type d ;
find /testftp/* -type f -iname DONOTDELETE.TXT -printf '%h'
) | sort | uniq -u
La sortie est:
/testftp/logs
La sortie est le répertoire où DONOTDELETE.TXT n’existe pas. C'est assez proche. Juste besoin d'afficher les fichiers.
-exec list {}/*
au lieu de-printf '%h'
. S'il montre les bons fichiers seulement peut-être que vous pouvez essayer-exec rm -f {}/*
( Attention: c'est dangereux! ). En outre, cela peut être utile.( find /testftp -type d ; find /testftp -type f -iname DONOTDELETE.TXT -exec list {} \; ) | sort | uniq -u
La sortie est: `find: list: Aucun fichier ou répertoire de ce type / testftp / testftp / logger / testftp / logs` DONOTDELETE.TXT est sous `/ testftp / logger`ls
ne paslist
(oublie toujours ça!)Réponses:
Voici mon point de vue sur elle:
Ajoutez ceci à un script, modifiez les variables avec votre propre convention de dénomination si vous le souhaitez (pour le fichier spécial et le nom du journal), puis appelez-le simplement avec le chemin du répertoire de départ en tant que paramètre. Il exclura tout répertoire contenant le fichier souhaité et supprimera tout le reste.
la source
Je pensais que j'essaierais celui-ci.
la source
find ./testftp/* -type d
"; existe = $ (ls $ dir | pour chacun dans $ (trouver $ dir -type f -iname $ ignorefile -printf '% h \ n'); ne echo -en" grep -v $ each | "; done | sed '$ s /.$//') direxists = $ (ls $ dir | eval $ existe | grep -v $ ignorefile | sed 's /: / \ // //' | sort | uniq -u) pour pth in $ direxists; do si [-d $ pth]; alors si ["$ (ls -A $ pth)"]; alors echo rm -f "" $ pth * "" fi fi done `Mais il n'a rien fait :(Si vous avez bash 4+ (vérifiez auprès de
bash --version
), vous pouvez le faire dans une ligne double:Notez que
shopt -s globstar
doit être sur sa propre ligne - ne pas simplement l'ajouter à la boucle avec un;
../**/
étend à chaque sous-répertoire dans le répertoire en cours et leurs sous-répertoires de manière récursive. Si vous voulez seulement descendre d’un arbre à l’autre, utilisez./*/
au lieu de cela (et ne vous inquiétez pas de mettre globstar); si vous voulez un contrôle plus fin que cela, vous devrez jouer avecfind
à la place (en particulier le-maxdepth
et-mindepth
options). j'utilise./**/
au lieu de**/
au cas où l'un de vos répertoires commence par un-
: cela les empêche d'être vu comme[[ -f "$f"/DONOTDELETE.TXT ]]
teste pour voir si ce fichier existe et est un fichier (si vous voulez qu'il fonctionne même si DO NOT DELETE.TEXT peut être autre chose qu'un fichier, utilisez-e
au lieu de-f
). Strictement parlant, vous n'avez pas besoin de/
dedans, puisque $ f contient une barre oblique de fin, mais je pense que cela a l'air mieux ainsi, et en général les barres obliques redondantes sont inoffensives.||
signifie OU - si (et seulement si) ce test a pour résultat faux , alors le code à droite de celui-ci sera exécuté, dans ce casrm -f "$f"/*
- qui supprime tous les fichiers, sauf les fichiers cachés.Si vous souhaitez également supprimer des fichiers cachés, vous pouvez utiliser quelque chose comme:
la source