Snažím se pochopit rozdíl mezi nimi dva příkazy:
sudo find / -name .DS_Store -delete
a
sudo find / -name ".DS_Store" -exec rm {} \;
Všiml jsem si, že -exec ... {}
metoda je upřednostňována. Proč? Která z nich je bezpečnější / rychlejší / lepší? Použil jsem obojí na svém Macbooku a zdá se, že vše funguje dobře.
Odpověď
-delete
bude mít lepší výkon, protože pro každou nemusí vytvářet externí proces a každý odpovídající soubor.
Je možné, že můžete často vidět -exec rm {} \;
, protože -delete
v všechny verze find
. Nemohu to teď zkontrolovat, ale jsem si docela jistý, že jsem použil find
bez něj.
B další metody by měly být „bezpečné“.
EDIT na komentář od @doitmyway: ujistěte se, že odpovídáte na jméno a pak smazat, nikoli naopak (smazat, pak se shodovat). Jinak bude odstraněn každý soubor, ať už se shoduje nebo ne . Tj. NEDĚLEJTE toto: find / -delete -name .DS_Store
.
Běžnou metodou, jak se vyhnout režii při vytváření externího procesu pro každý odpovídající soubor, je:
find / -name .DS_Store -print0 | xargs -0 rm
(zde však také existuje problém s přenositelností: ne všechny verze find mají -print0
!)
Komentáře
Odpovědět
Za předpokladu, že .DS_Store
představují soubory a nikoli adresáře, nejpřenosnějším a nejrychlejším způsobem by to bylo:
sudo find / -name .DS_Store -exec rm {} +
Jediným rizikem je, že sudo
nebude k dispozici, ale v dnešní době je poměrně nízký.
-delete
Možnost použitá k vyhledání GNU a je stále nestandardní v mnoha jiných find
implementacích, takže není vždy k dispozici.
Ukončení příkazu +
v místo \;
vysoce optimalizuje klauzuli exec
nespuštěním příkazu rm
pro každou a každý .DS_Store
přítomný v systému souborů.
Odpověď
U stroje, jako je jako váš MacBook nenajdete velký rozdíl ve výkonu mezi těmito dvěma příkazy. Pokud se však podíváte na verzi -exec, můžete vidět jemný rozdíl:
sudo find / -iname ".file-to-delete" -exec rm {} \;
To znamená, že všechny tyto soubory najdete s názvem „.file“ -vymazat“. Toto hledání však může vrátit některé nežádoucí falešné poplachy. Když děláte něco se sudo, měli byste být trochu opatrnější. Výhodou použití -exec rm {} je, že můžete předat argumenty do rm takto:
sudo find / -iname "*~" -exec rm -i {} \;
V tomto příkladu chci odstranit ty záložní soubory, které emacs dělá. Tato vlnovka by však mohla být v nějakém temném souboru, o kterém nevím a mohl by být důležitý. Navíc chci potvrdit smazání. Proto jsem do příkazu rm vložil volbu „-i“. Toto mi dá interaktivní smazání .
Také můžete upřesnit použití rm k mazání adresářů i souborů:
find /usr/local/share/ -iname "useless" -exec rm -r {} \;
Stručně řečeno, -exec dává máte o něco větší kontrolu nad skutečným příkazem, který odstraní nalezenou položku. Výhodou je, že k vyhledání souborů použijete jeden nástroj, jiný nástroj k jejich odstranění.Také ne každá verze vyhledávacího nástroje má volbu -delete. Takže je lepší použít každý nástroj pro jeho správnou práci. Toto je filozofie unixu – jeden nástroj, jedna práce, používejte je společně k tomu, co musíte udělat.
Komentáře
- Viz také
-ok rm {} \;
místo-exec rm {} \;
pro interaktivní potvrzení.
-delete
přepínače před-name
odstraníte zadaný strom souborů , takže si myslím, že musím být opatrný.find
můžete použít-exec rm {} +
k odstranění všech odpovídajících soubory s jediným příkazemrm
..DS_Store
není ' t neobsahují vůbec žádné speciální znaky, takže uvozovky jsou zbytečné a v tomto případě nic nemění.;
nebo|
nebo>
nebo<
a „ a mnoho dalších, které mají pro shell zvláštní význam, pokud nejsou uvedeny.xargs
pečlivě se stará o problém se seznamem argumentů s omezenou velikostí tím, že jej rozdělí na několik vyvolání příkazu.