Vraag Zoek een bestand op naam via de opdrachtregel


Ik zou graag de locatie van een bestand willen bepalen met behulp van de opdrachtregel. Ik heb geprobeerd:

find . -type f -name "postgis-2.0.0"

en

locate postgis-2.0.0

het mocht niet baten. Wat is de opdracht om de map van het bestand te bepalen, op voorwaarde dat de naam van het bestand?


125
2018-05-31 17:02


oorsprong


de locate commando is prima, werk eerst de locatedb bij, gebruik de opdracht updatedb - thucnguyen
Als het al is geïnstalleerd, is de nieuwe bestandsnaam mogelijk niet postgis-2.0.0 meer. Meestal na installaties via pakketbeheerders, zouden de uitvoerbare bestanden zich in een van de $PATH mappen, probeer which postgis om de locatie te zien. Als er niets wordt geretourneerd, moet u eerst handmatig zoeken naar de bestandslocatie. - sdkks


antwoorden:


Proberen find ~/ -type f -name "postgis-2.0.0" in plaats daarvan.

Gebruik makend van . zal alleen in de huidige map zoeken. ~/ doorzoekt je hele thuismap (waarschijnlijk waar je deze hebt gedownload). Als je het hebt gebruikt wget als root, is het mogelijk dat het ergens anders zou kunnen zijn, zodat je het zou kunnen gebruiken / om het hele bestandssysteem te doorzoeken.

Succes


154
2018-05-31 17:06



oh ya ik gebruikte wget als root dus / werkte dank - Sam007
voor meer bekijk deze link help.ubuntu.com/community/find - habibun
Ik krijg te vinden: / Users / UserName // Library / Saved Application State / com.bitrock.appinstaller.savedState: Machtiging geweigerde fout. het verschijnt bij elke uitvoering van de opdracht. Hoe kom je ervan af? - Eduard


Ik zou proberen:

sudo find / -type d -name "postgis-2.0.0"

De . betekent zoeken alleen in de huidige map, het is het beste om alles te doorzoeken vanaf root als je het echt niet weet. Type -f betekent ook zoeken naar bestanden, geen mappen. Het toevoegen sudo staat het toe om in alle mappen / submappen te zoeken.

Uw syntaxis voor locate klopt, maar je moet misschien rennen

sudo updatedb

eerste. Om welke reden dan ook, ik heb nooit geluk met locate though.

locate maakt gebruik van een database van bestanden en mappen gemaakt door updatedb. Dus als u een nieuw bestand heeft gedownload, is er meer kans dat uw updatedb heeft de database met bestanden en mappen niet bijgewerkt. Je kunt gebruiken sudo updatedb voor gebruik locate hulpprogramma. updatedb functioneert over het algemeen eenmaal per dag op Linux-systemen.


28
2018-05-31 17:12





find is een van de meest bruikbare Linux / Unix-tools.

Proberen find . -type d | grep DIRNAME


11
2018-05-31 17:11



Is er hier een voordeel aan het gebruik van grep over -name? - TryHarder
@oooooo Ik heb een reden toegevoegd in mijn antwoord hieronder - zanbri
vinden plus grep was het enige dat voor mij werkte - malhal


De andere antwoorden zijn goed, maar ik vind het nalaten Permission denied uitspraken geeft me duidelijkere antwoorden (weglatingen stderrs door niet te lopen sudo):

find / -type f -iname "*postgis-2.0.0*" 2>/dev/null

waar:

  • / kan worden vervangen door de directory waaruit u uw zoekopdracht wilt starten
  • f kan worden vervangen door d als u naar een map zoekt in plaats van naar een bestand
  • -iname kan worden vervangen door -name als u wilt dat de zoekopdracht hoofdlettergevoelig is
  • de *s in de zoekterm kan worden weggelaten als u de jokertekens in de zoekopdracht niet wilt

Een alternatief is:

find / -type f 2>/dev/null | grep "postgis-2.0.0"

Op deze manier worden resultaten geretourneerd als de zoekterm overal in het volledige bestandspad overeenkomt, bijvoorbeeld /home/postgis-2.0.0/docs/Readme.txt


2
2017-07-29 15:35



Er zijn -regex en -iregex schakelaars voor zoeken met Regular Expressions, die het pad ook zou vinden. Suggestie om een ​​item te vinden dat een bestand is (-type f) dan grep is duurder. Permission denied gebeurt wanneer de gebruiker geen toegang heeft tot bestanden of mappen, met behulp van sudo voordat find Zoeken zal toestaan ​​om alle bestanden te zien. - sdkks
Goed om te weten over de regex-switches, bedankt. - zanbri
@zanbri Gebruiken -wholename of -iwholename in plaats van leidingen naar grep. - wjandrea


Dit zou het zoeken naar bestanden eenvoudiger moeten maken:

Dit zou je het volledige pad naar het bestand geven

tree -f  / | grep postgis-2.0.0

Structuur geeft de inhoud van mappen weer in een boomstructuurindeling. de -f vertelt tree om het volledige pad naar het bestand te geven. omdat we geen idee hebben van zijn locatie of ouderlocatie, is het goed om te zoeken vanuit de root van het bestandssysteem / recursief naar beneden. Vervolgens sturen we de uitvoer naar grep om ons woord te markeren, postgis-2.0.0 


2
2017-11-18 03:16





Proberen find . -name "*file_name*"

  • waar je '.' kunt veranderen (kijk in de Current Directory) naar '/' (kijk in het hele systeem) of '~ /' (kijk in de Home Directory).

  • waar u "-name" in "-iname" kunt veranderen als u geen hoofdlettergevoelig wilt.

  • waar je kunt veranderen "bestandsnaam"(een bestand dat kan beginnen en eindigen met wat het ook is) naar de exacte naam van het bestand.


1
2018-03-13 10:05





Terwijl find opdracht is de eenvoudigste manier om de mappenboom recursief te doorlopen, er zijn andere manieren en met name de twee scripttalen die standaard bij Ubuntu horen, hebben al de mogelijkheid om dit te doen.

bash

bash  heeft een heel leuk globstar shell-optie, die recursieve traversal van de mappenboom mogelijk maakt. Alles wat we moeten doen, is testen of het item in de ./**/* uitbreiding is een bestand en of het de gewenste tekst bevat:

bash-4.3$ for f in ./**/* ;do [ -f "$f" ] && [[ "$f" =~ "postgis-2.0.0" ]] && echo "$f"; done 
./testdir/texts/postgis-2.0.0

Perl

Perl heeft de module Zoeken, waarmee recursieve traversal van de mappenboom kan worden uitgevoerd en via een subroutine specifieke actie kan worden uitgevoerd. Met een klein script kun je de mapstructuur doorlopen, bestanden die de gewenste tekenreeks bevatten in matrix plaatsen en deze als volgt afdrukken:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;

my @wanted_files;
find(
     sub{ 
         -f $_ && $_ =~ $ARGV[0]  
               && push @wanted_files,$File::Find::name
     }, "."
);

foreach(@wanted_files){
    print "$_\n"
}

En hoe het werkt:

$ ./find_file.pl  "postgis-2.0.0"                                                       
./testdir/texts/postgis-2.0.0

Python

Python is een andere scripttaal die op grote schaal wordt gebruikt in de Ubuntu-wereld. In het bijzonder, het heeft os.walk() module die ons in staat stelt om dezelfde actie uit te voeren als hierboven - doorloop directory tree en verkrijg een lijst van bestanden die de gewenste string bevatten.

Als one-liner kan dit als volgt worden gedaan:

$ python -c 'import os;print([os.path.join(r,i) for r,s,f in os.walk(".") for i in f if "postgis-2.0.0" in i])'                                                                         
['./testdir/texts/postgis-2.0.0']

Volledig script zou er zo uitzien:

#!/usr/bin/env python
import os;

for r,s,f in os.walk("."):
    for i in f:
        if "postgis-2.0.0" in i:
            print(os.path.join(r,i))

0
2017-07-13 02:23





$ find . -type f | grep IMG_20171225_*
geeft
./03-05--2018/IMG_20171225_200513.jpg
De DOT na het commando find is om een ​​startpunt te noemen,
Vandaar - de huidige map,
"piped" (= gefilterd) door het naamfilter IMG_20171225_*


0
2017-09-08 08:38