Vraag Hoe kunt u verborgen bestanden en mappen uitsluiten / negeren in een zoekactie naar zoekopdrachten met jokerteken?


Beginnend met (let op de wildcards voor en na "wat tekst")

find . -type f -name '*some text*'

hoe kan men alle verborgen bestanden en mappen uitsluiten / negeren?

Ik heb al Googlen veel te lang, kwam een ​​aantal tegen - en! (uitroepteken) parameters, maar geen passend (en spaarzaam) voorbeeld wat net werkte.

bies  | naar grep zou een optie zijn en ik zou daar ook voorbeelden van toejuichen; maar allereerst Ik ben geïnteresseerd in een korte one-liner (of een paar stand-alone oneliners, ter illustratie van verschillende manieren om hetzelfde opdrachtregeldoel te bereiken) net gebruik makend van find.

ps: Zoek naar bestanden in linux en sluit specifieke mappen uit lijkt nauw verwant, maar a) is nog niet geaccepteerd en b) is verwant-maar-anders-en-anders, maar c) kan inspiratie bieden en de verwarring helpen lokaliseren!

Bewerk

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", werkt. De regex zoekt naar "alles, dan een schuine streep, dan een punt, dan alles" (dat wil zeggen alle verborgen bestanden en mappen inclusief hun submappen), en de "!" ontkent de regex.


99
2018-03-10 11:58


oorsprong


Helpt niet bij wat je hebt gevraagd in je bewerking, maar kijk eens naar mijn vraag en het antwoord hier: unix.stackexchange.com/q/69164/15760 en ook de link in het antwoord.
Verwant: Verborgen bestanden uitsluiten bij zoeken met Unix / Linux vinden? - kenorb


antwoorden:


Hiermee drukt u alle bestanden af ​​die afstammelingen zijn van uw directory en verborgen bestanden en mappen overslaan:

find . -not -path '*/\.*'

Dus als u op zoek bent naar een bestand met some text in zijn naam, en u wilt verborgen bestanden en mappen overslaan, voer dan:

find . -not -path '*/\.*' -type f -name '*some text*'

Uitleg:

De -path optie-runs controleert een patroon tegen de volledige pad-reeks. * is een wildcard, / is een mapscheidingsteken, \. is een punt (het moet worden ontsnapt om een ​​speciale betekenis te vermijden), en * is een ander jokerteken. -not middelen selecteren geen bestanden die overeenkomen met deze test.

Ik denk dat niet find is slim genoeg om te voorkomen dat in de vorige opdracht op recursieve wijze naar verborgen mappen wordt gezocht, dus als je snelheid nodig hebt, gebruik dan -prune in plaats daarvan, zoals dit:

 find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f -name '*some text*' -print

109
2017-07-09 16:30



Noteer bij de laatste die je nodig hebt -print aan het einde! Ook niet zeker of -name '\.*' would be more efficient instead of -path` (omdat het pad subpaden zoekt, maar deze worden weggesnoeid) - artfulrobot
Wat is de speciale betekenis van . in deze context? - frostschutz
@frostschutz De punt erna find betekent de huidige map: find bekijkt alle bestanden en mappen onder de huidige map. Het argument erna path is een reguliere expressie, waarbij een punt normaal gesproken "elk teken" betekent, om het een letterlijke punt te maken, moeten we eraan ontsnappen met een backslash. Het argument erna -name  is niet een reguliere expressie, maar het breidt wildcards uit zoals ? en * zoals een shell dat doet. - Flimm
@frostschutz Eigenlijk, denk eraan, misschien heb ik ongelijk . met een speciale betekenis. - Flimm
@Flimm yup, niet nodig om te ontsnappen .. Voor zover ik weet, hoeven alleen deze te worden ontsnapt: *, ?, en []. - thdoan


Dit is een van de weinige manieren om dot-bestanden uit te sluiten die ook correct werken op BSD, Mac en Linux:

find "$PWD" -name ".*" -prune -o -print
  • $PWD print het volledige pad naar de huidige map zodat het pad niet begint ./
  • -name ".*" -prune komt overeen met bestanden of mappen die beginnen met een punt en vervolgens niet afdalen
  • -o -print betekent dat de bestandsnaam moet worden afgedrukt als de voorgaande uitdrukking niet overeenkomt met wat dan ook. Gebruik makend van -print of -print0 zorgt ervoor dat alle andere expressies niet standaard worden afgedrukt.

6
2018-03-24 13:51



Gelieve uit te leggen / uit te werken over "alarmerend ingewikkeld"; de antwoorden al gegeven en je antwoord lijkt het tegendeel te bewijzen ...? - nutty about natty
"schrikbarend gecompliceerd" is waarschijnlijk overdreven. Ik heb het antwoord opnieuw geformuleerd om ter zake te komen. Ik denk dat het antwoord dat ik heb gepost moeilijk te begrijpen is en moeilijk te zien is zonder een zeer zorgvuldige lezing van de man-pagina. Als je bent enkel en alleen met behulp van GNU find zijn er meer mogelijke oplossingen. - eradman
-o ... -print is nuttig. Voor mijn gebruik heb ik het nu find ... '!' -name . -name '.*' -prune -o ... -print, wat handiger was dan $ PWD. - Roger Pate
$ PWD moet waarschijnlijk worden aangehaald, voor het geval dat het een spatie bevat. - Daniel James
@DanielJames inderdaad, $PWD moet worden geciteerd - eradman


find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

Sluit alle verborgen mappen en verborgen bestanden onder $ DIR uit


4
2018-02-28 00:49



Dit is het perfecte antwoord. Het vindt recursief alle bestanden, maar sluit regelitems uit voor mappen en verborgen bestanden. Bedankt! - KyleFarris


 De antwoord Ik heb oorspronkelijk gepost als een "bewerking" van mijn oorspronkelijke vraag hierboven:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", werkt. De regex zoekt naar "alles, dan een schuine streep, dan een punt, dan alles" (dat wil zeggen alle verborgen bestanden en mappen inclusief hun submappen), en de "!" ontkent de regex.


3
2017-08-11 07:31



Gelijkaardig, maar alleen voor de huidige map: find . \( ! -regex './\..*' \) -type f -maxdepth 1 -print - phyatt


Je hoeft het niet te gebruiken find daarom. Gebruik globstar in shell it-self, zoals:

echo **/*foo*

of:

ls **/*foo*

waar **/ vertegenwoordigt elke map recursief en *foo* elk bestand dat heeft foo in zijn naam.

Standaard met gebruik van ls zal bestandsnamen afdrukken met uitzondering van verborgen bestanden en mappen.

Als u geen globbing heeft ingeschakeld, doe het dan shopt -s globstar.

Notitie: Een nieuwe globbingoptiewerkt in Bash 4, zsh en soortgelijke shells.


Voorbeeld:

$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar  a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo  a/b/c/d/foo_not_hidden

3
2018-04-20 09:49



Je hebt het niet nodig ls daarom! echo **/*foo* - Kevin Cox
@kenorb (en @ kevin-cox). Zou je wat meer uitgebreid kunnen zijn? Waarom zou globstar (= *) hier werken en hoe? Wat doet de schuine streep / doen? - nutty about natty
@nuttyaboutnatty / betekent map, het scheidt mappen van de bestandsnaam. * eigenlijk vertegenwoordigt alles. - kenorb
@kenorb yes-but: hoe helpt die one-liner met de oorspronkelijke vraag? - nutty about natty
@nuttyaboutnatty Verduidelijkt en toegevoegd voorbeeld. Het helpt bij het vinden van bestanden en negeert de verborgen. - kenorb


find heeft nette logica schakelaars zoals -and en -not je kunt ze in je voordeel gebruiken om een ​​overeenkomend bestand te vinden met twee regels zoals:

$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt                                                 

$ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \)                            
./non_hidden_file.txt

Zoals je kan zien, find gebruikt twee regels -name '*hidden_file*' en -and \( -not -name ".*" \) om die bestandsnamen te vinden die overeenkomen met beide voorwaarden - bestandsnaam met hidden_file erin maar zonder leidende punt. Let op de schuine strepen vóór het haakje - ze worden gebruikt om haakjes te definiëren als find argumenten die eerder een subshell definiëren (wat is wat haakjes anders betekenen zonder slashes)


1
2018-05-15 22:01