Portál AbcLinuxu, 28. listopadu 2025 07:06
/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ár
Adresar 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.