Ik heb gezocht naar een commando dat bestanden uit de huidige map terugstuurt die een string in de bestandsnaam bevatten. Ik heb locate
en find
commando’s gezien die bestanden kunnen vinden die beginnen met iets first_word*
of eindigen met iets *.jpg
.
Hoe kan ik een lijst met bestanden retourneren die een string in de bestandsnaam bevatten?
Bijvoorbeeld, als 2012-06-04-touch-multiple-files-in-linux.markdown
een bestand was in de huidige map.
Hoe kan ik dit bestand en andere bestanden retourneren die de tekenreeks touch
bevatten? Een commando gebruiken zoals find '/touch/'
Antwoord 1, autoriteit 100%
Gebruik find
:
find . -maxdepth 1 -name "*string*" -print
Het zal alle bestanden in de huidige map vinden (verwijder maxdepth 1
als je het recursief wilt) met “string” en zal het op het scherm afdrukken.
Als u een bestand met ‘:’ wilt vermijden, typt u:
find . -maxdepth 1 -name "*string*" ! -name "*:*" -print
Als je grep
wilt gebruiken (maar ik denk dat het niet nodig is voor zover je de bestandsinhoud niet wilt controleren), kun je het volgende gebruiken:
ls | grep touch
Maar, ik herhaal, find
is een betere en schonere oplossing voor uw taak.
Antwoord 2, autoriteit 4%
Gebruik grep als volgt:
grep -R "touch" .
-R
betekent herhaling. Als je liever niet naar de subdirectories gaat, sla het dan over.
-i
betekent “negeer hoofdletters”. Misschien vind je dit ook het proberen waard.
Antwoord 3, autoriteit 2%
De optie -maxdepth
moet vóór de optie -name
staan, zoals hieronder.,
find . -maxdepth 1 -name "string" -print
Antwoord 4
find $HOME -name "hello.c" -print
Dit zal het hele $HOME
(dwz /home/username/
) systeem doorzoeken op bestanden met de naam “hello.c” en hun padnamen weergeven:
/Users/user/Downloads/hello.c
/Users/user/hello.c
Het komt echter niet overeen met HellO.C
of HellO.C
. Overeenkomen is niet hoofdlettergevoelig, geef de optie -iname
als volgt door:
find $HOME -iname "hello.c" -print
Voorbeelduitgangen:
/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c
Geef de optie -type f
door om alleen naar bestanden te zoeken:
find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print
De -iname
werkt op GNU of BSD (inclusief OS X) versie find commando. Als uw versie van de opdracht find -iname
niet ondersteunt, probeer dan de volgende syntaxis met de opdracht grep
:
find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"
OF probeer
find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print
Voorbeelduitgangen:
/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c
Antwoord 5
Als de tekenreeks aan het begin van de naam staat, kunt u dit doen
$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt
Antwoord 6
Een alternatief voor de vele oplossingen die al geboden zijn, is het gebruik van de glob **
. Wanneer je bash
gebruikt met de optie globstar
(shopt -s globstar
) of je maakt gebruik van zsh
, dan kan hiervoor gewoon de glob **
gebruiken.
**/bar
zoekt recursief in de directory naar bestanden met de naam bar
(mogelijk inclusief het bestand bar
in de huidige directory). Merk op dat dit niet gecombineerd kan worden met andere vormen van globbing binnen hetzelfde padsegment; in dat geval keren de *
operatoren terug naar hun gebruikelijke effect.
Merk op dat er een subtiel verschil is tussen zsh
en bash
HIER. Terwijl bash
Soft-links naar mappen, zsh
zal doorlopen. Hiervoor moet u de Glob gebruiken ***/
IN zsh
.
Antwoord 7
find / -exec grep -lR "{test-string}" {} \;
Antwoord 8
grep -R "somestring" | cut -d ":" -f 1