Megpróbálom megérteni ezek közötti különbséget két parancs:
sudo find / -name .DS_Store -delete
és
sudo find / -name ".DS_Store" -exec rm {} \;
Észrevettem, hogy a -exec ... {}
módszert részesítik előnyben. Miért? Melyik a biztonságosabb / gyorsabb / jobb? Mindkettőt használtam a Macbook on, és úgy tűnik, hogy minden jól működik.
Válasz
-delete
jobban fog teljesíteni, mert nem kell mindegyikhez külső folyamatot létrehoznia és minden egyező fájlt.
Lehetséges, hogy gyakran látja a -exec rm {} \;
fájlt, mert a -delete
nem létezik az find
összes verziója. Most nem tudom ellenőrizni, de biztos vagyok benne, hogy enélkül find
-t használtam.
B az összes módszernek “biztonságosnak” kell lennie.
SZERKESZTÉS a @doitmyway kommentjeinként: győződjön meg róla, hogy megfelel a néven és majd törölje, ne fordítva (törölje, majd egyezzen). Ellenkező esetben minden fájl törlődik, akár egyezik, akár nem . Vagyis, NE NE tegye ezt: find / -delete -name .DS_Store
.
Általános módszer a külső folyamatok létrehozásának elkerülésére az egyes illesztett fájlok esetében:
find / -name .DS_Store -print0 | xargs -0 rm
(de vegye figyelembe, hogy itt is van hordozhatósági probléma: a megtalálás nem minden verziójában van -print0
!)
Megjegyzések
Válasz
Ha feltételezzük, hogy .DS_Store
fájlokat képvisel, és nem könyvtárakat, akkor ennek a leghordozhatóbb, mégis gyors módja lenne:
sudo find / -name .DS_Store -exec rm {} +
Az egyetlen kockázat az, hogy a sudo
nem elérhető, de manapság elég alacsony.
A -delete
opció, amely a GNU keresésére szolgál, és sok más find
megvalósításban még mindig nem szabványos, ezért nem mindig érhető el.
A parancs lezárása +
be Az \;
helyett a exec
záradékot úgy optimalizálja, hogy nem futtatja a rm
parancsot minden .DS_Store
, amely jelen van a fájlrendszeren.
Válasz
Ilyen gép esetén mivel a MacBook nem fog nagy különbséget találni a két parancs teljesítményében. Ha azonban megnézzük az -exec verziót, láthatunk egy apró különbséget:
sudo find / -iname ".file-to-delete" -exec rm {} \;
Ez azt jelenti, hogy megtalálja az összes nevű fájlt .file -törölni”. Ez a keresés azonban nem kívánt hamis pozitív eredményeket hozhat. Ha valamit csinálsz a sudo-val, akkor egy kicsit óvatosabbnak kell lenned. Az -exec rm {} használatának előnye, hogy argumentumokat adhat át az rm-nek így:
sudo find / -iname "*~" -exec rm -i {} \;
Ebben a példában el akarom távolítani azokat a biztonsági mentési fájlokat, amelyek emacs gyárt. Ez a tilde azonban lehet olyan homályos fájlban, amelyről nem tudok, és fontos lehet. Plusz megerősíteni szeretném a törlést. Tehát az “-i” opciót tettem az rm parancsra. Ez interaktív törlést ad .
Továbbá finomíthatja az rm használatát a könyvtárak és a fájlok törléséhez:
find /usr/local/share/ -iname "useless" -exec rm -r {} \;
Röviden: az -exec megadja valamivel jobban szabályozhatja a tényleges parancsot, amely eltávolítja a talált elemet. Előnye, hogy egy eszközzel megtalálja a fájlokat, másik eszközzel pedig eltávolítja őket.A find segédprogram nem minden verziójában található a -delete opció. Ezért jobb, ha minden eszközt a megfelelő feladatához használ. Ez az unix filozófia – egy eszköz, egy munka, használja őket együtt arra, amit meg kell tennie.
Megjegyzések
- Lásd még:
-ok rm {} \;
az-exec rm {} \;
helyett az interaktív megerősítéshez.
-delete
kapcsoló használatával a-name
törlés előtt a megadott fájlfa , úgyhogy azt hiszem, óvatosnak kell lennem.find
fájlokban az-exec rm {} +
paranccsal eltávolíthatja az összes egyezést. fájlok egyetlenrm
paranccsal..DS_Store
nem ' t tartalmazhat speciális karaktereket, ezért az idézőjelek feleslegesek, és ebben az esetben semmit sem változtatnak.;
vagy|
vagy>
vagy<
és “és még sokan mások, amelyeknek külön jelentése van a héjnak, hacsak nem idézzük őket.xargs
átláthatóan gondoskodik a korlátozott méretű argumentumlista problémáról, a parancs többszörös meghívására bontva.