Portál AbcLinuxu, 12. května 2025 08:06

Dotaz: find, tar

3.2.2006 08:58 David Muller
find, tar
Přečteno: 337×
Odpovědět | Admin
Zdravim

Potřeboval bych rozbalit vícero tar archivů, tak aby se každý .tar rozbalil v adresáři kde je. Chtěl jsem použít find

find / -name "*.tar" -type f -exec tar xf {} \;

ale to mi rozbalí všechny .tar do adresáře odkud to volám.

Nějakej nápad?
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

3.2.2006 10:37 cronin | skóre: 49
Rozbalit Rozbalit vše Re: find, tar
Odpovědět | | Sbalit | Link | Blokovat | Admin
man dirname
3.2.2006 12:58 David Muller
Rozbalit Rozbalit vše Re: find, tar
BINGO

Díky, díky, díky

for I in `find <adr> -name "*.tar" -type f`

do

cd `dirname $I`

tar xf $I

cd $OLDPWD

done
3.2.2006 13:32 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: find, tar

Za trest napiš stokrát: Nikdy nebudu používat for i in `cokoli` a speciálně ne pro find!

Důvod je, že to naprosto spolehlivě zhavaruje pro výsledky findu, které překročí velikost bufferu shellu a hlavně to rozesere jakákoliv mezera nebo jiný fuj znak. Horší je snad jen for i in `ls *.tar`, za které bych rovnou stavěl ke zdi. To už si nic jiného nezaslouží a dotyčný se aspoň už nebude trápit. To by mě fakt zajímalo, kde se tyhle prasárny berou, to se snad někde vyučuje nebo co. Když už chci výstup findu spracovávat shellem, tak to jde velmi elegantně find | while read filename; do ... done

Tahle úloha má ale mnohem elegantnější řešení

find -name '*.tar' -type f -printf "tar xfC '%p' '%h'\n" | sh
Je to bezpečné (teda kromě apostrofu v názvu souboru, nebo v cestě, ale všechny ostatní znaky a mezery to zvládne) a nesrovnatelně rychlejší. Místo milión pěti volání basename, přepínání pwd a expanze výsledku do řádku shellu se spustí jen jednou find a shell a tary tolikrát, kolik je nezbytné.

XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
6.2.2006 20:52 David Muller
Rozbalit Rozbalit vše Re: find, tar
Díky, rád se nechá poučit, nejsem programátor, puhý letitý samouk :)
7.2.2006 11:32 David Muller
Rozbalit Rozbalit vše Re: find, tar
Bohužel to funguje pouze na Linuxu, Na Solarisu (8) ne :(
7.2.2006 12:47 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: find, tar
find(1), tar(1) Kde je problém, ve skrácených parametrech taru nebo nebo v expanzi %p a %h v -printf findu? V prvním případě je řešením
find -name '*.tar' -type f -printf "tar --extract --file '%p' --directory '%h'\n" | sh
V druhém nalezení ekvivalentu, nebo použití while read a basename, což je teda opruz. No a nebo taky používat nové GNU a ne sto let staré nástroje.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
3.2.2006 19:50 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: find, tar
Odpovědět | | Sbalit | Link | Blokovat | Admin
Stačí místo -exec použít -execdir:
  find / -name '*.tar' -type f -execdir tar -xf {} \;

Ale nevím, od jaké verze GNU tar tuto akci umí (1.15.1 ano).

7.2.2006 11:33 David Muller
Rozbalit Rozbalit vše Re: find, tar
RHEL 3, ani Sol. 8 "-execdir" u "find" nezna :(
7.2.2006 11:52 Mortal | skóre: 26 | blog: mortals_log
Rozbalit Rozbalit vše Re: find, tar
nainstalovat novější find?
V pekle jsou samé diskety a ďábel je velká disketová mechanika

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.