Foto s laskavým svolením Qole Pejorian
Kromě základní operace hledání souborů v adresářové struktuře můžete také provádět několik praktických operací pomocí příkazu find, které vám usnadní cestu příkazového řádku.
V tomto článku se podíváme na 15 praktických příkladů příkazu find v Linuxu, které budou velmi užitečné pro nováčky i odborníky.
Nejprve vytvořte ve svém domovském adresáři následující vzorové prázdné soubory, abyste mohli vyzkoušet některé z níže uvedených příkladů příkazu find.
# vim create_sample_files.sh touch MybashProgram.sh touch mycprogram.c touch MyCProgram.c touch Program.c mkdir backup cd backup touch MybashProgram.sh touch mycprogram.c touch MyCProgram.c touch Program.c # chmod +x create_sample_files.sh # ./create_sample_files.sh # ls -R .: backup MybashProgram.sh MyCProgram.c create_sample_files.sh mycprogram.c Program.c ./backup: MybashProgram.sh mycprogram.c MyCProgram.c Program.c
1. Najít soubory pomocí názvu
Toto je základní použití příkazu find. Tento příklad najde všechny soubory s názvem — MyCProgram.c v aktuálním adresáři a všech jeho podadresářích.
# find -name "MyCProgram.c" ./backup/MyCProgram.c ./MyCProgram.c
2. Najít soubory pomocí názvu a ignorování velikosti písmen
Toto je základní použití příkazu find. Tento příklad najde všechny soubory s názvem — MyCProgram.c (bez ohledu na velikost písmen) v aktuálním adresáři a všech jeho podadresářích.
# find -iname "MyCProgram.c" ./mycprogram.c ./backup/mycprogram.c ./backup/MyCProgram.c ./MyCProgram.c
3. Omezit vyhledávání na konkrétní úroveň adresáře pomocí mindepth a maxdepth
Najděte soubor passwd ve všech podadresářích počínaje kořenovým adresářem.
# find / -name passwd ./usr/share/doc/nss_ldap-253/pam.d/passwd ./usr/bin/passwd ./etc/pam.d/passwd ./etc/passwd
Najděte soubor passwd pod rootem a o úroveň níže. (tj. kořen – úroveň 1 a jeden podadresář – úroveň 2)
# find -maxdepth 2 -name passwd ./etc/passwd
Najděte soubor passwd pod rootem a o dvě úrovně níže. (tj. kořen – úroveň 1 a dva podadresáře – úroveň 2 a 3 )
# find / -maxdepth 3 -name passwd ./usr/bin/passwd ./etc/pam.d/passwd ./etc/passwd
Najděte soubor s hesly mezi podadresářem úrovně 2 a 4.
# find -mindepth 3 -maxdepth 5 -name passwd ./usr/bin/passwd ./etc/pam.d/passwd
4. Provádění příkazů na souborech nalezených příkazem Najít.
V níže uvedeném příkladu příkaz find vypočítá součet md5 všech souborů s názvem MyCProgram.c (bez ohledu na velikost písmen). {} je nahrazeno aktuálním názvem souboru.
# find -iname "MyCProgram.c" -exec md5sum {} \; d41d8cd98f00b204e9800998ecf8427e ./mycprogram.c d41d8cd98f00b204e9800998ecf8427e ./backup/mycprogram.c d41d8cd98f00b204e9800998ecf8427e ./backup/MyCProgram.c d41d8cd98f00b204e9800998ecf8427e ./MyCProgram.c
5. Invertování shody.
Zobrazuje soubory nebo adresáře, jejichž jméno není MyCProgram.c. Protože maxdepth je 1, bude to vypadat pouze v aktuálním adresáři.
# find -maxdepth 1 -not -iname "MyCProgram.c" . ./MybashProgram.sh ./create_sample_files.sh ./backup ./Program.c
6. Hledání souborů podle čísla inodu.
Každý soubor má jedinečné číslo inodu, pomocí kterého můžeme tento soubor identifikovat. Vytvořte dva soubory s podobným názvem. tj. jeden soubor s mezerou na konci.
# touch "test-file-name" # touch "test-file-name " [Note: There is a space at the end] # ls -1 test* test-file-name test-file-name
Z výstupu ls nemůžete určit, který soubor má mezeru na konci. Pomocí volby -i můžete zobrazit číslo inodu souboru, které se bude u těchto dvou souborů lišit.
# ls -i1 test* 16187429 test-file-name 16187430 test-file-name
V příkazu find můžete zadat číslo inodu, jak je uvedeno níže. V tomto příkladu příkaz find přejmenuje soubor pomocí čísla inodu.
# find -inum 16187430 -exec mv {} new-test-file-name \; # ls -i1 *test* 16187430 new-test-file-name 16187429 test-file-name
Tuto techniku můžete použít, když chcete provést nějakou operaci se soubory, které jsou pojmenovány špatně, jak je znázorněno v příkladu níže. Například soubor s názvem — soubor?.txt má v sobě speciální znak. Pokud se pokusíte spustit „rm file?.txt“, všechny následující tři soubory budou odstraněny. Postupujte podle níže uvedených kroků a odstraňte pouze soubor „file?.txt“.
# ls file1.txt file2.txt file?.txt
Najděte čísla inodů každého souboru.
# ls -i1 804178 file1.txt 804179 file2.txt 804180 file?.txt
Pomocí čísla inodu odstraňte soubor, který měl speciální znak, jak je znázorněno níže.
# find -inum 804180 -exec rm {} \; # ls file1.txt file2.txt [Note: The file with name "file?.txt" is now removed]
7. Najděte soubor na základě oprávnění k souboru
Jsou možné následující operace.
- Najděte soubory, které přesně odpovídají oprávněním
- Zkontrolujte, zda se daná oprávnění shodují, bez ohledu na další bity oprávnění
- Vyhledávejte pomocí osmičkové / symbolické reprezentace
Pro tento příklad předpokládejme, že adresář obsahuje následující soubory. Vezměte prosím na vědomí, že oprávnění k souborům u těchto souborů se liší.
# ls -l total 0 -rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all -rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read ---------- 1 root root 0 2009-02-19 20:31 no_for_all -rw------- 1 root root 0 2009-02-19 20:29 ordinary_file -rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read ----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
Najděte soubory, které mají oprávnění ke čtení seskupit. Pomocí následujícího příkazu vyhledejte všechny soubory, které jsou čitelné světem ve vašem domovském adresáři, bez ohledu na jiná oprávnění pro daný soubor.
# find . -perm -g=r -type f -exec ls -l {} \; -rw-r--r-- 1 root root 0 2009-02-19 20:30 ./everybody_read -rwxrwxrwx 1 root root 0 2009-02-19 20:31 ./all_for_all ----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read -rw-r----- 1 root root 0 2009-02-19 20:27 ./others_can_also_read
Najděte soubory, které mají oprávnění pouze ke čtení pro skupinu.
# find . -perm g=r -type f -exec ls -l {} \; ----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
Najít soubory, které mají oprávnění pouze ke čtení seskupit [ hledat podle osmičkové soustavy ]
# find . -perm 040 -type f -exec ls -l {} \; ----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
8. Najděte všechny prázdné soubory (soubor s nulovým bajtem) ve svém domovském adresáři a jeho podadresáři
Většina souborů následujícího výstupu příkazu budou soubory zámků a zástupné symboly vytvořené jinými aplikacemi.
# find ~ -empty
Uveďte všechny prázdné soubory pouze ve vašem domovském adresáři.
# find . -maxdepth 1 -empty
Vypsat pouze neskryté prázdné soubory pouze v aktuálním adresáři.
# find . -maxdepth 1 -empty -not -name ".*"
9. Nalezení top 5 velkých souborů
Následující příkaz zobrazí prvních 5 největších souborů v aktuálním adresáři a jeho podadresáři. Spuštění může chvíli trvat v závislosti na celkovém počtu souborů, které musí příkaz zpracovat.
# find . -type f -exec ls -s {} \; | sort -n -r | head -5
10. Nalezení 5 nejlepších malých souborů
Technika je stejná jako hledání větších souborů, ale jediný rozdíl v řazení je vzestupné.
# find . -type f -exec ls -s {} \; | sort -n | head -5
Ve výše uvedeném příkazu s největší pravděpodobností uvidíte pouze soubory ZERO byte ( prázdné soubory ). Můžete tedy použít následující příkaz k zobrazení seznamu menších souborů jiných než soubory ZERO bajtů.
# find . -not -empty -type f -exec ls -s {} \; | sort -n | head -5
11. Najít soubory podle typu souboru pomocí volby -type
Najděte pouze soubory soketu.
# find . -type s
Najít všechny adresáře
# find . -type d
Najít pouze normální soubory
# find . -type f
Najděte všechny skryté soubory
# find . -type f -name ".*"
Najděte všechny skryté adresáře
# find -type d -name ".*"
12. Najděte soubory porovnáním s dobou úpravy jiného souboru.
Zobrazit soubory, které jsou upraveny po zadaném souboru. Následující příkaz find zobrazí všechny soubory, které jsou vytvořeny/upraveny po obyčejný_soubor.
# ls -lrt total 0 -rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read ----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read -rw------- 1 root root 0 2009-02-19 20:29 ordinary_file -rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read -rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all ---------- 1 root root 0 2009-02-19 20:31 no_for_all # find -newer ordinary_file . ./everybody_read ./all_for_all ./no_for_all
13. Najít soubory podle velikosti
Pomocí volby -size můžete najít soubory podle velikosti.
Najít soubory větší než daná velikost
# find ~ -size +100M
Najít soubory menší než daná velikost
# find ~ -size -100M
Najít soubory, které přesně odpovídají dané velikosti
# find ~ -size 100M
Poznámka:– znamená menší než daná velikost, + znamená více než danou velikost a žádný symbol neznamená přesně danou velikost.
14. Vytvořte alias pro operace častého hledání
Pokud vám nějaká věc přijde docela užitečná, můžete ji vytvořit jako alias. A spusťte jej, kdykoli budete chtít.
Často odstraňujte soubory s názvem a.out.
# alias rmao="find . -iname a.out -exec rm {} \;" # rmao
Odstraňte základní soubory generované programem c.
# alias rmc="find . -iname core -exec rm {} \;" # rmc
15. Odstraňte velké archivní soubory pomocí příkazu find
Následující příkaz odstraní soubory *.zip, které jsou větší než 100 milionů.
# find / -type f -name *.zip -size +100M -exec rm -i {} \;"
Odstraňte všechny soubory *.tar, které jsou větší než 100M, pomocí aliasu rm100m (Odebrat 100M). Použijte podobné koncepty a vytvořte alias jako rm1g, rm2g, rm5g pro odstranění velikosti souboru větší než 1G, 2G a 5G.
# alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;" # alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;" # alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} \;" # alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} \;" # rm100m # rm1g # rm2g # rm5g
Najděte příklady příkazů Druhá část
Pokud se vám tento článek o mamince o příkazu find líbil, nezapomeňte se podívat na článek o příkazu find – tatínku, našel jsem to!, 15 úžasných příkladů příkazů hledání v Linuxu (část 2)
Úžasné články o Linuxu
Následuje několik úžasných 15 příkladů články, které by vám mohly pomoci.
- 15 příkladů zvládnutí historie příkazového řádku Linuxu
- Příkaz Unix LS:15 praktických příkladů
- Ovládněte Grep! – 15 praktických příkladů příkazů Grep
- Linux Crontab:15 úžasných příkladů úloh Cron