Hoe kan ik “grep” voor een bestandsnaam in plaats van de inhoud van een bestand?

grepwordt gebruikt om in een bestand te zoeken om te zien of een regel overeenkomt met een bepaalde reguliere expressie . Ik heb echter deze situatie – ik wil een reguliere expressie schrijven die overeenkomt met de bestandsnaam zelf (en niet de inhoud van het bestand). Ik zal dit uitvoeren vanuit de hoofdmap van het systeem, om al die bestanden te vinden die overeenkomen met de reguliere expressie.

Als ik bijvoorbeeld alle Visual Basic-formulierbestanden wil vinden die beginnen met een ” f” en eindigen met .frm, ik gebruik de reguliere expressie –

  "f[[:alnum:]]*\.frm"

Kan grep dit? Zo niet, is er dan een hulpprogramma waarmee ik dit kan doen?


Antwoord 1, autoriteit 100%

Je moet in dit geval findgebruiken in plaats van grep.

Je kunt findook gebruiken in combinatie met grepof egrep:

$ find | grep "f[[:alnum:]]\.frm"

Antwoord 2, autoriteit 63%

Voorbeeld

find <path> -name '*FileName*'

Uit handleiding:

vind -naam patroon

De basis van de bestandsnaam (het pad waarvan de leidende mappen zijn verwijderd) komt overeen met het shellpatroonpatroon.
Omdat de leidende mappen worden verwijderd, zullen de bestandsnamen die worden overwogen voor een overeenkomst met -name nooit
voeg een schuine streep toe, dus “-name a/b” zal nooit overeenkomen met iets (waarschijnlijk moet u in plaats daarvan -path gebruiken). De
metatekens (“*”, “?” en “[]”) komen overeen met een “.” aan het begin van de basisnaam (dit is een wijziging in find‐
utils-4.2.2; zie de sectie STANDAARDEN CONFORMANTIE hieronder). Om een map en de bestanden eronder te negeren,
gebruik -snoeien; zie een voorbeeld in de beschrijving van -path. Een beugel wordt niet als bijzonder erkend,
ondanks het feit dat sommige schelpen, waaronder Bash, beugels doordrenken met een speciale betekenis in schelppatronen.
Het matchen van bestandsnamen wordt uitgevoerd met behulp van de bibliotheekfunctie fnmatch(3). Vergeet niet om
zet het patroon tussen aanhalingstekens om het te beschermen tegen uitzetting door de schaal.


Antwoord 3, autoriteit 38%

Zoals Pablo al zei, moet je findgebruiken in plaats van grep, maar het is niet nodig om findnaar grep. findheeft die functionaliteit ingebouwd:

find . -regex 'f[[:alnum:]]\.frm'

findis een zeer krachtig programma voor het zoeken naar bestanden op naam en ondersteunt zoeken op bestandstype, dieptebeperking, het combineren van verschillende zoektermen met booleaanse bewerkingen en het uitvoeren van willekeurige opdrachten op gevonden bestanden. Zie de man-pagina zoekenvoor meer informatie.


Antwoord 4, autoriteit 15%

Je kunt het relatieve pad van een bestand vinden met tree. Leid de uitvoer naar grep om naar beneden te filteren:

tree -f | grep filename

Hier is een functie die u in uw .bash_profile, .bashrc, .zshrcof andere…

kunt plaatsen

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

Antwoord 5, autoriteit 10%

De gemakkelijkste manier is

find . | grep test

Hier vindenzal een lijst weergeven van alle bestanden in de (.), d.w.z. de
huidige directory, recursief.

En dan is het gewoon een simpele grep. Alle bestanden met de naam “test” zullen verschijnen.

Je kunt naar wens met grepspelen.
Opmerking: aangezien de grep een algemene tekenreeksclassificatie is. Het kan ertoe leiden dat u niet alleen bestandsnamen krijgt. Maar als een pad een map heeft (‘/xyz_test_123/other.txt’), zou het ook deel uitmaken van de resultatenset.


Antwoord 6, autoriteit 7%

find -iname "file_name"
Syntax:
find -type type_descriptor file_name_here

type_descriptortypen:

f: normaal bestand

d: map

l: symbolische link

c: tekenapparaten

b: apparaten blokkeren


Antwoord 7, autoriteit 4%

U kunt ook het volgende doen:

tree | grep filename

Dit stuurt de uitvoer van het tree-commando naar grep voor een zoekopdracht. Dit zal je alleen vertellen of het bestand bestaat.


Antwoord 8

find . | grep KeywordToSearch

Hier .betekent de huidige directory die de waarde is voor de parameter pathvoor de findcommando. Het wordt doorgesluisd naar grep om het trefwoord te zoeken dat alle overeenkomende resultaten zou moeten opleveren.

Opmerking: dit is hoofdlettergevoelig. Dus bijvoorbeeld fileNameen fileNamezijn niet hetzelfde.


Antwoord 9

Ook voor meerdere bestanden.

tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"

Antwoord 10

Nee, grep werkt hier prima voor:

grep -rl "filename" [starting point]
 grep -rL "not in filename"

Other episodes