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.
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 proname
parametr, např.find "snap"
je stejný jakofind -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ělujefind
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?