GNU/Linux >> Znalost Linux >  >> Linux

Jak najít soubory s desítkami kritérií pomocí příkazu Bash Find

Stalo se vám někdy, že jste uvízli při hledání souboru a nemohli jste si vzpomenout, kam jste jej uložili, natož samotný název souboru? V systému Linux je to Bash find příkaz vám pomůže prohledat váš systém a najít tento soubor.

Nejste čtenář? Podívejte se na tento související video tutoriál! b>Nevidíte video? Ujistěte se, že máte vypnutý blokovač reklam.

Bash find příkaz v Linuxu nabízí mnoho způsobů, jak hledat soubory a adresáře. V tomto tutoriálu se dozvíte, jak poslední přístup k souboru, oprávnění a další mohou pomoci najít soubory a adresáře pomocí Bash find příkaz. Začněme!

Předpoklady

Pokud chcete sledovat různé ukázky v tomto tutoriálu, ujistěte se, že máte následující:

  • Počítač se systémem Linux – Tento výukový program používá Ubuntu 20.04, ale měla by fungovat jakákoli distribuce Linuxu.
  • find nástroj – Nástroj Bash find by již měl být ve všech distribucích Linuxu. Tento tutoriál používá verzi 4.7.0.

The Bash find Příkaz 101

Nalezení souboru vyžaduje určitá kritéria; část názvu souboru, typ souboru, oprávnění k souboru atd. find umožňuje definovat tato kritéria pro zúžení přesných souborů, které chcete najít. Příkaz find najde nebo vyhledává také symbolické odkazy (symlink). Symbolický odkaz je soubor zástupce systému Linux, který odkazuje na jiný soubor nebo složku ve vašem počítači. Nejprve si proberme nejzákladnější způsob použití Bash find příkaz.

Možná jste ve svém domovském adresáři a hledáte adresář s názvem snap a všechny soubory a podadresáře pod ním. V takovém případě spusťte find za ním následuje název adresáře ("snap" ), a je to!

Protože níže nejsou žádné další argumenty příkazového řádku, můžete si prohlédnout seznam souborů a adresářů nalezených rekurzivně uvnitř snap adresář.

find "snap"

Pokud nezadáte name parametr, find bude předpokládat, že první argument by měl být pro name parametr, např. find "snap" je stejný jako find -name "snap .“

Vyhledání souborů pomocí testů (neboli filtrů)

Viděli jste nejzákladnější formu find příkaz a jak to funguje. Možná však budete chtít vyhledávání trochu zúžit a definovat konkrétnější kritéria. Pokud ano, budete muset použít testy. Testy jsou kritéria, která poskytujete find příkaz.

Testy říkají find k filtrování výstupu na základě mnoha různých kritérií.

Vyhledání souborů podle názvu souboru nebo adresáře

Možná si pamatujete pouze to, jak začíná název souboru, možná bez ohledu na velikost písmen. V takovém případě můžete použít zástupný znak, který pomůže zúžit výsledky.

# Find files and directories with names starting with 'snap'
find -name "snap*"

# Find files and directories with names starting with 'snap'
# in case insensitive manner (For example:'Snap', 'snap', 'SNaP', etc.)
find -iname "snap*"

Vyhledání souborů a adresářů podle typu souboru

Stejně jako -name test, -type test je další účinný způsob hledání souborů a adresářů. -type test umožňuje filtrovat výsledek find pomocí souborů nebo adresářů.

# Find a file named 'snap'
find "snap" -type f
# Find a directory named 'snap'
find "snap" -type d

Chcete-li dále zúžit vyhledávání souborů, zkombinujte -name a -type testy spuštěním příkazu níže.

find níže uvedený příkaz hledá pouze adresáře (-type d ) s názvy (-name ), které začínají snap .

find -name "snap*" -type d

Vyhledání souborů a adresářů pomocí testů a operátorů

Nyní, když jste se naučili základy find v kombinaci s testy, je čas posunout vyhledávání souborů o stupeň výš. Možná potřebujete najít soubory nebo adresáře, které splňují více než jednu podmínku, jako je název a typ souboru. V takovém případě musíte podmínky zkombinovat.

Pokud potřebujete přidat více než jednu podmínku k nalezení souborů, můžete podmínky kombinovat s operátory. Operátory jsou prvky, které umožňují kombinovat podmínky a vytvářet složitější testy/filtry.

Kombinace dvou podmínek s -and Operátor

Možná potřebujete najít nějaké soubory nebo adresáře, které odpovídají konkrétnímu názvu a typ. K tomu můžete použít -and operátor. -and operátor umožňuje zkombinovat dva nebo více výrazů a výsledek zobrazí pouze v případě, že příkaz find vrátí hodnotu true. Výrazy jsou reprezentace určitých podmínek, například při filtrování souborů podle názvu (-name "snap" ).

Chcete-li ukázat, jak -and operátor kombinuje dvě podmínky, spusťte každý z následujících příkazů.

# Find files only (-type f) and (-and) ensure the names (-name) start with snap
# in the current directory and subdirectories.
find -name "snap*" -and -type f

# Find directories only (-type d) and (-and) ensure the names (-name) start with snap
# in the current directory and subdirectories.
find -name "snap*" -and -type d

# Find files only (-type f) and (-and) ensure the names (-name) start with snap
find -name "snap" -and -type f

# Find directories only (-type d) and (-and) ensure the names (-name) start with snap
find -name "snap" -and -type d

Kombinace dvou podmínek s -or Operátor

Stejně jako -and operátor -or operátor (-o ) také kombinuje dva samostatné výrazy. Rozdíl je v tom, že find příkaz vypíše výsledky, i když je pravdivý pouze jeden výraz.

Níže je uvedena základní syntaxe, jak zkombinovat dvě podmínky s -or operátor. find příkaz vypíše výsledek, i když pouze jeden, buď výraz1 nebo výraz2, vrátí hodnotu true.

find  -or 

Možná byste chtěli najít název souboru pomocí -name parametr konkrétního typu pomocí -type parametr. Pokud ano, spusťte find příkaz níže k vyhledání souborů (-type f ) s názvy (-name ), které začínají snap -or chart .

find -name "snap*" -type f -or -name "chart*"

Odfiltrování souborů pomocí -not Operátor

Na rozdíl od prvních dvou operátorů, kde filtrujete obsah, který hledáte, -not operátor (! ) je tomu naopak. -not operátor vyloučí soubory a adresáře, které nechcete vidět ve výsledku vyhledávání.

Možná chcete najít soubory pouze s názvy, které není začít konkrétním jménem. V takovém případě spusťte následující příkaz. Všimněte si find níže uvedený příkaz hledá pouze soubory (-type f ), s názvy (-name ), které nedělají začněte snap .

find -not -name "snap*" -type f

Hledání souborů podle výrazů seskupení

Nyní jste se naučili používat testy a operátory k filtrování find výsledek příkazu. Ale co když je váš cílový výsledek trochu složitý? Pokud ano, musíte se podívat na seskupovací výrazy. Bash find umožňuje seskupovat výrazy, což znamená definovat dvě nebo více podmínek „setů“.

Seskupování výrazů pomocí závorek

Řekněme, že potřebujete najít soubory nebo adresáře s různými názvy. Pomocí find brzy zjistíte, že tento úkol není možný základy velení, jak bylo uvedeno výše. Jako řešení budete muset použít závorky ke spojení výrazů do jednoho komplexního výrazu.

V tomto příkladu níže find příkaz buď vyhledá soubory (-type f ) s .html rozšíření nebo adresáře (-type d ) s názvy začínajícími chart .

Otevřené i zavřené závorky jsou zakončeny zpětným lomítkem (\ ), aby terminál mohl číst závorky doslovně. Znak escape sděluje find příkaz zacházet s postavou doslova.

find \( -name "*.html" -type f \) -or \( -name "chart*" -type d \)

Místo použití závorek můžete také použít čárky k seskupení výrazů jako find -name "snap*" -type d -delete, -name "chart*" -print . Seskupování výrazů podle čárek je v podstatě běžná série úloh v jediném příkazu.

Vyhledávání souborů z nadřazeného adresáře

Ve všech předchozích příkladech Bash find příkaz našel soubory pouze z aktuálního pracovního adresáře a všech podadresářů. Možná ale budete muset místo toho začít hledat v nadřazeném adresáři. Pokud ano, zadejte -depth možnost výstřel. -depth Parametr uvádí soubory a adresáře v pořadí od prvního do hloubky, jak je ukázáno níže.

find příkaz níže vypíše nejprve obsah z nadřazeného adresáře a dolů do pracovního adresáře (snap ).

find "snap" -depth

Vyhledání souborů a adresářů podle oprávnění

Místo hledání souborů filtrovaných podle názvu a typu vám příkaz find také umožňuje najít soubory a adresáře filtrované podle oprávnění. V Linuxu má každý soubor a složka specifikovaná oprávnění pro vlastníky, vlastníky skupin a další uživatele. find umožňuje využít tato oprávnění k filtrování výsledků vyhledávání na soubory a adresáře pomocí -perm možnost.

Než se pokusíte najít soubory a adresáře pomocí -perm možnost, budete se muset seznámit s oprávněními ke čtení. Oprávnění označují, kdo má přístup a může upravovat určité soubory a adresáře.

Hledání souborů prostřednictvím symbolického režimu

Nyní, když rozumíte konceptu oprávnění k souboru, zkuste najít soubory pomocí symbolického režimu. Symbolický režim používá k reprezentaci oprávnění k souboru kombinaci písmen a symbolů.

Chcete-li předvést, jak najít soubory prostřednictvím symbolického režimu, spusťte každý z následujících příkazů.

# Find only files (-type f) in the working directory (.) 
# with read, write and execute permissions for user, group and others in the current
find . -perm u=rwx,g=rwx,o=rwx -type f

# Find files (-type f) in the working directory (.) 
# with any of the read, write and execute permissions (not the exact)
# for user, group and others in the current
find . -perm -u=rwx,g=rwx,o=rwx -type f

# Find files (including hidden files) where either of the user, group or others 
# have read, write and execute access to files in the working directory (.)
find . -perm /u=rwx,g=rwx,o=rwx -type f

Vyhledání souborů a adresářů prostřednictvím absolutního režimu

Pokud nechcete hledat soubory prostřednictvím symbolického režimu, může vás zaujmout absolutní režim. Absolutní režim definuje oprávnění v osmičkovém číselném vyjádření vs. pomocí písmen.

Níže vidíte, že symbolický režim -rwxrwxrwx je ekvivalentní absolutnímu režimu 777 .

Řekněme, že chcete najít pouze soubory a adresáře s oprávněním pouze pro čtení pro uživatele, skupinu a další. Pokud ano, spusťte každý z níže uvedených příkazů, abyste viděli výsledky, které získáte při hledání souborů a adresářů v absolutním režimu.

# Find files and directories only with read-only permission 
# for user, group and others in the working directory (.)
find . -perm 444

# Find files and directories only that have least the read-only permission 
# for user, group and others in the working directory (.)
find . -perm -444

# Find files and directories only (including hidden files and directories) 
# that have least the read-only permission 
# for user, group and others in the working directory (.)
find . -perm /444

Upravte výstup výsledků vyhledávání pomocí -print Parametr

Namísto pouhého zobrazení cest k souborům ve výsledku hledání možná budete chtít vidět také jejich vlastnosti. Pomocí -print můžete upravit výstup find příkaz vytváří.

-print Parametr je výchozí chování při spuštění find kde vytiskne výsledek hledání souborů, každý na nový řádek. Spusťte tedy některý z níže uvedených příkazů na find soubory a adresáře s názvem snap , získáte stejný výsledek.

find -name "snap" -print
find -name "snap"

Vyhledání a tisk názvů souborů bez mezer

Na rozdíl od výchozího -print parametr, -print0 Tato možnost vám umožňuje vymazat mezery nebo znaky nového řádku ve výsledku vyhledávání vráceném find příkaz. Zvláště když předáváte výsledek jinému příkazu, jako je grep hledat vzory.

Níže uvedený příkaz vám umožní najít a vytisknout adresář bez mezer nebo znaků nového řádku.

# Find a file or directory named 'snap', print the result
# removing white spaces and newline characters
find -name "snap" -print0

Vyhledání a tisk souboru s vlastnostmi prostřednictvím formátování tisku

Chcete-li změnit formát výstupu, find příkaz má také -printf parametr. Tento parametr vám umožňuje vytvářet direktivy nebo „formátovače“, které definují, jak bude výsledek vyhledávání vypadat.

Možná budete muset najít soubory spolu s jejich vlastnostmi, jako když byly naposledy zpřístupněny. Pokud ano, spusťte následující příkazy.

# Find files only with names starting with 'snap', then print each file 
# along with their last-time access properties, full path and filename
# each on a new line
find -name "snap*" -printf "%a %p \n"

# Find files with .html or .json extension 
# then print each file owner's username, group name, full path and filename
# each on a new line
find \( -name "*.html" -type f \) -or -name "*.json" -printf "%u %g %p \n"

Níže je uveden seznam direktiv, které jsou k dispozici pro práci vedle sebe s -printf akce:

  • %a – Vrátí čas posledního přístupu k souboru.
  • %b – Vrací množství místa na disku použitého pro soubor v 512bajtových blocích.
  • %d – Vrátí hloubku souboru ve stromu adresářů.
  • %g – Vrátí název skupiny souboru nebo číselné ID skupiny, pokud skupina nemá žádný název.
  • %k – Vrátí množství místa na disku použitého pro soubor v blocích po 1 kB.
  • %m – Vrátí bity oprávnění souboru (v osmičkové soustavě).
  • %p – Vrátí přesný název souboru.
  • %s – Vrátí velikost souboru v bajtech.
  • %t – Vrátí čas poslední úpravy souboru ve formátu vráceném -ctime možnost.
  • %u – Vrátí uživatelské jméno vlastníka souboru nebo číselné ID uživatele, pokud uživatel nemá žádné jméno.

Omezení hloubky hledání souborů

Možná si přejete dále zúžit a omezit vyhledávání v adresářích; budete muset použít -maxdepth možnost s find příkaz, jak je uvedeno níže.

-maxdepth parametr říká find příkaz k omezení rozsahu vyhledávání pouze na určitý počet podadresářů v adresářovém stromu.

# Find files and directories one step down from the working directory
find . -maxdepth 1 -name "chart*"

# Find files and directories two steps down from the ~/chart directory
find ~/chart -maxdepth 2 -name "chart"

Hledání souborů omezených na pracovní adresář s -prune Možnost

Pokud potřebujete omezit vyhledávání pouze na aktuální pracovní adresář a nevracet se do žádných podadresářů, podívejte se na -prune parametr.

V níže uvedeném příkazu získáte find soubory a adresáře, které pojmenovávají (-name ) nezačínejte snap a je omezený (-prune ) do pracovního adresáře (. ).

Chcete-li získat výsledky vyhledávání pro soubory a složky s názvy začínajícími na snap místo toho odeberte -or operátor a -print action , takto:find . -name "snap*" -prune

find . -name "snap*" -prune -or -print

Vyhledání souborů a adresářů pomocí posledního přístupu

Ořezávání konkrétních souborů jistě zúží výsledek hledání. Co když si ale o hledaném souboru pamatujete pouze to, kdy jste k němu naposledy přistupovali? Dobrá zpráva je, že příkaz find vám umožňuje vyhledávat soubory a adresáře prostřednictvím jejich posledního přístupu. Pojďme se ponořit!

Vyhledání souborů prostřednictvím přístupu k souboru za poslední den

Řekněme, že si stále pamatujete poslední den, kdy jste přistupovali k souboru nebo adresáři, pak -atime možnost kombinovaná s find příkaz je vše, co potřebujete, jak je ukázáno níže. Pokud poslední přístup k souboru nespadá pod zadanou hodnotu, find příkaz vrátí false hodnotu a přeskočí tento soubor.

# Find files and directories you last accessed between 2-3 days ago
find -atime 2

# Find files and directories you last accessed within the past 2 days
find -atime -2

# Find files and directories you last accessed within the past day
find -atime 0

Možná také chcete vidět poslední přístup k souboru nebo adresáři a přidat -printf akce s direktivami. Příkazový řádek níže vám umožní find soubory zpřístupněné za poslední den (-atime 0 ). Poté -printf akce vypíše poslední přístup (%a ) souborů nebo adresářů a názvy souborů (%p ), každý na novém řádku (\n ), jak je uvedeno níže.

find -atime 2 -printf "%a %p \n"

Vyhledání souborů prostřednictvím přístupu k souboru na poslední chvíli

Řekněme, že potřebujete najít soubory podle minuty. Stejně jako -atime možnost, -amin funguje stejně. Místo toho však získáte výsledky vyhledávání souborů filtrovaných podle jejich posledního přístupu na základě hodnoty, kterou jste zadali, jak je uvedeno níže.

# Find files and directories accessed within the past 40 minutes
# Not ideal most of the time as you will get result of tons of files and directories
find -amin 40

# Find directories accessed within the past 40 minutes
find -name "snap*" -type d -amin -40

# Find files accessed within the past 40 minutes
find -name "snap*" -type f -amin -40

Vyhledání souborů a adresářů pomocí poslední změny

Nalezení souborů nebo adresářů prostřednictvím posledního přístupu může vygenerovat spoustu výsledků, které by vypadaly matoucí, pokud jsou názvy souborů podobné. Chcete-li tedy výsledek vyhledávání dále zúžit, použijte -ctime místo toho. -ctime volba filtruje výsledek vyhledávání podle času, kdy jste naposledy provedli změny v souboru nebo adresáři na základě zadané hodnoty (v posledních dnech).

Možná chcete najít soubory, které jste naposledy upravili před dvěma dny. Pokud ano, spusťte níže uvedené ukázkové příkazy.

# Find files and directories you modifed in the past two days
find -ctime -2

# Find files and directories with names starting with 'snap'
# which you modifed in the past two days
find -name "snap*" -ctime -2

Spuštění příkazu po nalezení souboru nebo adresáře

find příkaz nenajde pouze soubory a adresáře; může také spouštět příkazy hned po zobrazení výsledků vyhledávání pomocí -exec parametr. Tato funkce je skvělá, když chcete například otevřít soubor v textovém editoru nebo odstranit nalezený soubor či adresář.

Nezapomeňte ukončit středníky (; ) se zpětným lomítkem (\ ), aby se zabránilo jejich interpretaci.

# Find a file named 'snap.doc' then open the file in vi editor
find -name "snap.doc" -exec vi {} \;

# Find a file named 'snap.doc' then remove the file
find -name "snap.doc" -exec rm {} \;

Odebrání souborů a adresářů pomocí -delete Akce

find příkaz vám neumožňuje pouze najít soubory, jak jste se dosud naučili. find příkaz vám také dává možnost automaticky odstranit soubor, jakmile bude nalezen. Možná budete muset odstranit prázdné soubory nebo adresáře s určitým názvem nebo odpovídajícím konkrétnímu vzoru. Poté find příkaz s -delete akce se určitě bude hodit.

Demonstrovat mazání souborů a adresářů pomocí -delete akci, nejprve vytvořte adresář a soubor. Níže vám příkazové řádky umožňují vytvořit (mkdir ) adresář s názvem (thanos ), pak soubor s názvem snap uvnitř thanos adresář.

mkdir thanos
touch thanos/snap

-delete akce smaže pouze prázdné adresáře. Pokud se tedy pokusíte smazat thanos adresář pomocí příkazového řádku níže, zobrazí se zpráva najít:nelze smazat „thanos“:Adresář není prázdný.

Chcete-li smazat jeden soubor (snap ), zadejte -type test, když spustíte příkaz find, takto:find "snap" -type f -delete

# Find a directory named 'thanos', then delete the directory
# This command fails since the 'thanos' directory is not empty
find "thanos" -type d -delete

# Find a file named 'thanos.snap', then delete the file
find "thanos.snap" -type f -delete

Chcete-li odstranit ~/thanos adresář, použijte -depth možnost, jak je uvedeno níže. find příkaz vyhledá thanos adresář a rekurzivně smazat (-delete ) obsah ~/thanos adresář a smažte samotný adresář.

find "thanos" -depth -delete

Závěr

Cílem tohoto článku bylo naučit vás různými způsoby, jak vám příkaz Bash find umožňuje vyhledat soubory, získat vlastnosti souboru a dokonce upravit výstup v určitých formátech. Dříve bylo hledání ztraceného souboru plné překážek na cestě. Ale teď můžete skákat přes překážky a jít přímo do cíle – považuje se to za podvádění?

No, bez ohledu na to, kterou metodou jste se pokusili najít svůj soubor, zážitek je jistě uspokojivý! Jaký test, akce nebo možnost vás tedy nejvíce zaujal?


Linux
  1. Najděte soubory a adresáře v Linuxu pomocí příkazu find

  2. Jak najít soubory v CentOS 8 na příkazovém řádku

  3. Jak najít duplicitní soubory v Linuxu? Nápověda je zde s příkazem fdupes!

  1. Použití linuxového příkazu find – Použití s ​​příklady

  2. Jak používat Linuxový příkaz find k hledání souborů

  3. Jak v Linuxu zobrazím seznam souborů s úplnými cestami?

  1. Jak najít proces s maximálním počtem deskriptorů souborů?

  2. Jak najít soubory pomocí příkazu fd v Linuxu

  3. Jak třídit soubory do složek podle typu souboru na bash (pomocí příkazu 'file')?