Popis problému
Může se vám stát, že chcete vyhledat soubory v kořenovém nebo jiném adresáři, kde existují připojené další disky, ale nechcete tyto disky a souborové systémy zahrnovat do výsledků.
Popis (zdroj: man)
Příkaz find
je používán k vyhledávání souborů a adresářů v souborovém systému. Může být použit k vyhledávání souborů podle různých kritérií, jako je název, typ, velikost, datum poslední změny a další.
Parametry
-path
- Specifikuje cestu k adresáři nebo souboru, který má být vyhledán.-prune
- Ignoruje adresáře a soubory, které odpovídají zadanému kritériu, a nezanořuje se do těchto adresářů.-xdev
- Nezapočítávejte adresáře na jiných souborových systémech.
POZOR!!! Omezení použití -prune
-prune
nemá efekt, pokud je použit s parametrem-depth
.-prune
nemá efekt, pokud je-delete
použit společně s-prune
.- Pokud je
-prune
použit s jinou akcí než-print
, může být ignorován.
Použití -prune
Parametr -prune
je používán k ignorování adresářů, které neodpovídají zadanému kritériu. Pokud je adresář prunován, jeho obsah nebude ani vyhodnocen.
Příklad:
find . -name .snapshot -prune -o $ \! -name '*~' -print0 $
Tento příkaz vyhledá všechny soubory v aktuálním adresáři a jeho podadresářích, kromě adresářů, které obsahují soubor .snapshot
. Parametr -prune
ignoruje adresáře, které neodpovídají zadanému kritériu.
Konstrukce -prune -o
Konstrukce -prune -o
je často používána k ignorování adresářů, které neodpovídají zadanému kritériu. Příklad:
find . -path ./src/emacs -prune -o -print
Tento příkaz vyhledá všechny soubory v aktuálním adresáři a jeho podadresářích, kromě adresáře src/emacs
a jeho podadresářů. Parametr -prune
ignoruje adresáře, které neodpovídají zadanému kritériu.
Použití -xdev
Parametr -xdev
je používán k nezapočítávání se do adresářů na jiných souborových systémech.
Příklad:
find / -xdev -type f -print
Tento příkaz vyhledá všechny soubory v adresáři /
a jeho podadresářích, pouze na lokálním souborovém systému.
Kombinace parametrů
Parametry -path
, -prune
a -xdev
lze kombinovat k vytvoření komplexních vyhledávacích kritérií.
Příklad:
find /home/user -path ./src/emacs -prune -o -xdev -type f -print
Tento příkaz vyhledá všechny soubory v adresáři /home/user
a jeho podadresářích, kromě adresáře src/emacs
a jeho podadresářů, pouze na lokálním souborovém systému.
Pozor! Vadný příklad od AI - Příklad použití v praxi
-xdev musí být jako první argument/akce
-print musí být úplně na konci
find / -xdev -path /home -prune -a -path /mnt -prune -a -path /media -prune -type f \( -name "*.elf" -o -name "*.jpg" -o -name "*.svg" -o -name "*.gif" -o -name "*.png" -o -name "*.bmp" -o -name "*.ico" -o -name "*.mp3" -o -name "*.wav" -o -name "*.m4p" -o -name "*.mp4" -o -name "*.avi" -o -name "*.mov" -o -name "*.java" -o -name "*.zip" -o -name "*.gz" -o -name "*.sqlite" -o -name "*.c" -o -name "*.h" -o -name "*.f" -o -name "*.exe" -o -name "*.dll" -o -name "*.exe" -o -name "*.ini" -o -name "*.wps" -o -name "*.xls" -o -name "*.xml" -o -name "*.db" -o -name "*.jar" -o -name "*.a" -o -name "*.jsonlz4" -o -name "*_dll" -o -name "*.plist" -o -name "*.tex" -o -name "*.deb" -o -name "*.mat" -o -name "*.tz" -o -name "*.bz2" -o -name "*.php" -o -name "*.class" -o -name "*_exe" -o -name "*.go" \) -print
Tento příkaz nevypíše nic.
Validní příklad, opravený po konzultaci s ChatGPT 4o
sudo find / \( -path /home -o -path /mnt -o -path /media \) -prune -o -type f \( -name "*.elf" -o -name "*.jpg" -o -name "*.svg" -o -name "*.gif" -o -name "*.png" -o -name "*.bmp" -o -name "*.ico" -o -name "*.mp3" -o -name "*.wav" -o -name "*.m4p" -o -name "*.mp4" -o -name "*.avi" -o -name "*.mov" -o -name "*.java" -o -name "*.zip" -o -name "*.gz" -o -name "*.sqlite" -o -name "*.c" -o -name "*.h" -o -name "*.f" -o -name "*.exe" -o -name "*.dll" -o -name "*.exe" -o -name "*.ini" -o -name "*.wps" -o -name "*.xls" -o -name "*.xml" -o -name "*.db" -o -name "*.jar" -o -name "*.a" -o -name "*.jsonlz4" -o -name "*_dll" -o -name "*.plist" -o -name "*.tex" -o -name "*.deb" -o -name "*.mat" -o -name "*.tz" -o -name "*.bz2" -o -name "*.php" -o -name "*.class" -o -name "*_exe" -o -name "*.go" \)
Příkaz konečně vypisuje soubory.
ChatGPT k tomu píše:
Problémy s logickými operátory -o a -a
Logický operátor -o (OR) způsobí, že find
bude pokračovat v hledání i tehdy, pokud některá část výrazu není pravdivá. Pokud použijete -prune -o
, find
provede -prune
(ignoruje zadanou cestu) a pak zbytek operace OR (tedy další část výrazu). Tento přístup může být problematický, pokud není správně nastaven.
Logický operátor -a (AND) vyžaduje, aby všechny části výrazu byly pravdivé, což může vést k tomu, že žádné soubory nebudou splňovat podmínky, pokud jsou kritéria příliš přísná.
Správné použití -prune
Když použijete -prune
, říkáte find
, aby neprocházel určité cesty, což je užitečné, pokud nechcete prohledávat například /home
, /mnt
a /media
. Ovšem pokud následně použijete -o
, můžete nevědomky obejít tento -prune
, pokud následující podmínky vrátí pravdu.
Aby -prune
fungoval správně, obvykle se používá s -o
a následujícím kritériem, například -print
.
Přístupová práva a chyby
Chyby typu Operace zamítnuta a Nepřípustný argument jsou způsobeny tím, že váš příkaz find
nemá dostatečná oprávnění k přístupu k určitým adresářům nebo speciálním souborům. To může způsobit, že některé části souborového systému nejsou prohledány.
Tyto chyby však nezpůsobí, že by find
nenašel žádné soubory, pokud jsou přístupné jiné části souborového systému.
Nesprávně nastavené filtry
Možná problém tkví v tom, že soubory, které hledáte, se skutečně nenacházejí v prohledávaných cestách, nebo je filtr příliš specifický.
Návrh na úpravu příkazu
Zkuste upravit příkaz takto:
sudo find / \( -path /home -o -path /mnt -o -path /media \) -prune -o -type f -name "*.xml" -print
Vysvětlení:
\( -path /home -o -path /mnt -o -path /media \)
: Tato část shromažďuje cesty, které chcete ignorovat.-prune
: Zastaví procházení těchto cest.-o
: Po zrušení procházení ignorovaných cest pokračuje v prohledávání ostatních.-type f
: Pouze soubory, ne adresáře.-name "*.xml"
: Hledání souborů s koncovkou.xml
.-print
: Vypíše nalezené soubory.
Řešení problémů s přístupem
Pokud vidíte chyby Operace zamítnuta, můžete je ignorovat nebo je filtrovat pomocí 2>/dev/null
, aby se nezobrazovaly:
sudo find / \( -path /home -o -path /mnt -o -path /media \) -prune -o -type f -name "*.xml" -print 2>/dev/null
Tento příkaz by měl být schopen najít soubory, pokud se nacházejí v povolených částech souborového systému.
Žádné komentáře:
Okomentovat