Portál AbcLinuxu, 14. května 2025 04:02
/data/test1/XYZ /data/januar/XYZ /data/ijkl/XYZCize aby sa nasli vsetky XYZ podpriecinky a v nich zmazat vsetky subory. Vdaka.
find . -type d -name "XYZ" -exec rm -f {} \;
# find . -type d -name "XYZ/" -exec rm -f {} \; find: upozornenie: Unixové názvy súborov väčšinou neobsahujú lomky (hoci názvy ciest áno). To znamená, že '-name `XYZ/'' bude pravdepodobne stále vyhodnotené ako zlyhanie v tomto systéme. Viac použiteľným testom môže byť '-wholename', alebo možno '-samefile'. Alebo, ak používate GNU grep, môžete použiť 'find ... -print0 | grep -FzZ `XYZ/''. # find . -type d -name "XYZ" -exec rm -f {} \; rm: nie je možné odstrániť `./XYZ': Je adresárAdresar musi zostat zachovany a len potrebujem premazat subory v nom. Vdaka.
find /path/to/data -type d -name XYZ -exec find '{}' -maxdepth 1 -type f \; \ | (readarray -t files; rm "${files[@]}";)
Tohle^^^ nedá příkazu rm
žádný adresář ani jiný zásadní důvod ke stížnostem a bude to fungovat i pro soubory a adresáře s názvem začínajícím tečkou nebo s mezerami v názvech. Doporučuji dát si napřed echo
před rm
a vyzkoušet si tak, co přesně to bude dělat.
Trochu tomu může pomoct -prune
. Hodí se, (a) pro efektivitu, pokud se ví, že v případných podadresářích uvnitř XYZ
už nemůže být další XYZ
, případně (b) pro variantu zadání, kde ve struktuře podadresářů XYZ
může být další XYZ
, který se ale už nemá promazávat. Stejně jako výše, echo
is your friend:
find /path/to/data -type d -name XYZ -prune -exec find '{}' -maxdepth 1 -type f \; \ | (readarray -t files; rm "${files[@]}";)
na žádost autora implicitně skryto jako zavádějící
Zobrazit komentářUuuuf, pozor, tohle^^^ je naprosto hloupé a nebezpečné, protože to smaže všechny soubory ve stejném adresáři jako XYZ
, nikoliv uvnitř XYZ
. Asi jsem měl zatmění mysli, když jsem to „zjednodušení“ psal.
Inu, nic naplat, první slovo platí, druhé leze z prdele.
rm -rf
On chtěl smazat všechny soubory, ne nutně podadresáře.
rm /data/*/XYZ/*
pokud to ma byt vcetne podadresaru, tak
rm -r /data/*/XYZ/*
Pouze pokud je hloubka zanoření vždy stejná, což ale zadání nespecifikuje. Pokud není vždy stejná, asi nezbude nic jiného než find
.
#!/bin/zsh setopt extendedglob rm -f **/XYZ/*(.)
Pokud máte jako shell Zsh a extendedglob v .zshrc, tak stačí jen ten poslední řádek.
find . -type d -name xyz -exec sh -c "cd {} && rm -f *" \;
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.