Känns som jag har lite otur när jag tänker nu, men om man har en mapp med låt säga hundra undermappar med godtyckliga namn och det i vissa av dessa undermappar finns en eller flera textfiler med godtyckliga namn men som slutar på .txt.
Jag kan då lätt få fram en lista på vilka av dessa kataloger som innehåller en sådan textfil. Men om jag vill göra det omvända pch få fram en lista på de kataloger som inte innehåller någon text-fil, hur gör man enklast då?
echo 'import os
kataloger = {}
kataloger_med_textfil = []
kataloger_utan_textfil = []
for rot, underkataloger, filer in os.walk("."):
if rot not in kataloger:
kataloger[rot] = False
for i in underkataloger:
if rot+"/"+i not in kataloger:
kataloger[rot+"/"+i] = False
for i in filer:
if i.endswith(".txt"):
kataloger[rot] = True
for i in kataloger.keys():
if kataloger[i]:
kataloger_med_textfil += [i]
else:
kataloger_utan_textfil += [i]
print("Följande kataloger innehåller minst en textfil:")
print(kataloger_med_textfil)
print("Följande kataloger innehåller inte en enda textfil:")
print(kataloger_utan_textfil)' | python3
Jag antar att du endast är intresserad av filer som slutar med ".txt" men struntar i filer som slutar med ".TXT". Microsoft Windows har dille på att skapa filer med stora filnamn.
Förklaring
För varje mapp under nuvarande mapp kör bash med inställningarna att när den expanderar "*.txt" så matcha både gemener och versaler (nocaseglob), och om ingen fil matchar mönstret expandera till ingenting (nullglob). Där filerna den matchar blir input argumenten (set -- *.txt). Sedan kollar den om antalet argument är 0 ([ "$#" = 0 ]). Vilket blir status koden bash returnerar till find. Om status är 0, alltså uttrycket "$#" = 0 är sant, så skriv ut mappen (-print)
Senast redigerat
Dagens ordspråk:
Den som väntar på något gått väntar alltid för länge.