Ik moet lege mappen zoeken voor een bepaalde lijst met mappen.
Sommige mappen hebben mappen erin.
Als de interne mappen ook leeg zijn, kan ik zeggen dat de hoofdmap leeg is, anders is het niet leeg.
Hoe kan ik dit testen?
Bijvoorbeeld:
A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
Antwoord 1, autoriteit 100%
Het hangt een beetje af van wat u met de lege mappen wilt doen. Ik gebruik de onderstaande opdracht wanneer ik verwijderalle lege mappen in een boom, zeg test
map.
find test -depth -empty -delete
Een ding om op te merken over de bovenstaande opdracht is dat het ook lege bestanden verwijdert, dus gebruik de optie -type dom dat te voorkomen.
find test -depth -type d -empty -delete
Drop -delete
om de overeenkomende bestanden en mappen te zien.
Als uw definitie van een lege mappenboom is dat deze geen bestanden bevat, dan kunt u iets bij elkaar plakken op basis van het feit of find test -type f
iets teruggeeft.
find
is een geweldig hulpprogramma en RTFM vroeg en vaak om echt te begrijpen hoeveel het kan doen 🙂
Antwoord 2, autoriteit 23%
U kunt het volgende commando gebruiken:
find . -type d -empty
Antwoord 3, autoriteit 12%
Controleer of find <dir> -type f
voert alles uit. Hier is een voorbeeld:
for dir in A B C; do
[ -z "`find $dir -type f`" ] && echo "$dir is empty"
done
Antwoord 4, autoriteit 10%
find directory -mindepth 1 -type d -empty -delete
Dit is de versie die ik het meest interessant vond. Als het wordt uitgevoerd vanuit de directory, worden alle lege directory’s hieronder verwijderd (een directory wordt als leeg beschouwd als deze alleen lege directory’s bevat).
De mindiepte-optie voorkomt dat de map zelf wordt verwijderd als deze leeg is.
Antwoord 5, autoriteit 8%
find . -type d -empty
vindt en geeft een lijst weer van lege mappen en submappen in de huidige boomstructuur.
bijv. resulterende lijst met lege mappen en submappen:
./2047
./2032
./2049
./2063
./NRCP26LUCcct1/2039
./NRCP26LUCcct1/2054
./NRCP26LUCcct1/2075
./NRCP26LUCcct1/2070
Er wordt geen bewerking uitgevoerd op de mappen. Ze worden gewoon vermeld.
Dit werkt voor mij.
Antwoord 6, autoriteit 6%
Zoek gewoon lege mappen
Om alleen lege mappen te vinden (zoals gespecificeerd in de titel van de vraag), is het antwoord van Mosgcorrect:
find -type d -empty
Maar -empty
is mogelijk niet beschikbaar op zeer oude find
-versies (dit is het geval van HP-UXbijvoorbeeld). Als dit het geval is, raadpleegt u de technieken die worden beschreven in de onderstaande sectie Is een map leeg?.
Lege mappen verwijderen
Dit is een beetje lastig: stel dat een map MyDir
lege mappen bevat. Na het verwijderen van deze lege mappen, wordt MyDir
een lege map en moet deze ook worden verwijderd. Daarom gebruik ik het commando rmdir
met de optie --parents
(of -p
) dat indien mogelijk ook de bovenliggende mappen verwijdert:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
Op oudere find
-versies wordt de instructie +
nog niet ondersteund, daarom kunt u in plaats daarvan ;
gebruiken:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
Is een map leeg?
De meeste van deze antwoorden leggen uit hoe u kunt controleren of een map leeg is. Daarom geef ik hier de drie verschillende technieken die ik ken:
-
[ $(find your/dir -prune -empty) = your/dir ]
d=your/dir if [ x$(find "$d" -prune -empty) = x"$d" ] then echo "empty (directory or file)" else echo "contains files (or does not exist)" fi
een variatie:
d=your/dir if [ x$(find "$d" -prune -empty -type d) = x"$d" ] then echo "empty directory" else echo "contains files (or does not exist or is not a directory)" fi
Uitleg:
find -prune
is vergelijkbaar metfind -maxdepth 0
met minder tekensfind -type d
drukt alleen mappen af-
find -empty
drukt de lege mappen en bestanden af> mkdir -v empty1 empty2 not_empty mkdir: created directory 'empty1' mkdir: created directory 'empty2' mkdir: created directory 'not_empty' > touch not_empty/file > find empty1 empty2 not_empty -prune -empty empty1 empty2
-
(( ${#files} ))
Deze truc is 100%
bash
maar roept (spawnt) een sub-shell aan. Het idee is van Bruno De Fraineen verbeterd door teambob‘s opmerking. Ik raad deze aan als je bashgebruikt en als je script hoeft niet draagbaar te zijn.files=$(shopt -s nullglob dotglob; echo your/dir/*) if (( ${#files} )) then echo "contains files" else echo "empty (or does not exist or is a file)" fi
Opmerking:geen verschil tussen een lege map en een niet-bestaande map (en zelfs als het opgegeven pad een bestand is).
-
[ $(ls -A your/dir) ]
Deze truc is geïnspireerd op nixCraft’s artikelgepost in 2007. Andrew Taylorantwoordde in 2008 en gr8can8dianin 2011.
if [ "$(ls -A your/dir)" ] then echo "contains files" else echo "empty (or does not exist or is a file)" fi
of de eenregelige bashism-versie:
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
Opmerking:
ls
geeft$?=2
terug als de directory niet bestaat. Maar geen verschil tussen een bestand en een lege map.
Antwoord 7
Hoe zit het met rmdir *
? Die opdracht zal mislukken in niet-lege mappen.