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

  • vidím. Také jsem si ' přečetl, že pomocí -delete přepínače před -name odstraníte zadaný strom souborů , takže si myslím, že musím být opatrný.
  • Na nedávném find můžete použít -exec rm {} + k odstranění všech odpovídajících soubory s jediným příkazem rm.
  • .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í.
  • V zásadě je pouze mezera (mezery, tabulátory, možná jiné) jediná věc, která způsobí interpretaci nekótovaného řetězce jako dva samostatné argumenty příkazového řádku, ale to není ' vše, co vás při rozhodování, zda citovat, nebo ne. Musíte si dělat starosti s všemi metaznaky prostředí jako ; nebo | nebo > nebo < a „ a mnoho dalších, které mají pro shell zvláštní význam, pokud nejsou uvedeny.
  • @MarcoMarsala 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.

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í.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *