Lege mappen zoeken

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 testmap.

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 -deleteom 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 fiets teruggeeft.

findis 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 fvoert 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 -emptyis 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 MyDirlege mappen bevat. Na het verwijderen van deze lege mappen, wordt MyDireen lege map en moet deze ook worden verwijderd. Daarom gebruik ik het commando rmdirmet 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:

  1. [ $(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 -pruneis vergelijkbaar met find -maxdepth 0met minder tekens
    • find -type ddrukt alleen mappen af
    • find -emptydrukt 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
      
  2. (( ${#files} ))

    Deze truc is 100% bashmaar roept (spawnt) een sub-shell aan. Het idee is van Bruno De Fraineen verbeterd door teambob‘s opmerking. Ik raad deze aan als je gebruikt 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).

  3. [ $(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:lsgeeft $?=2terug 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.

Other episodes