Portál AbcLinuxu, 10. května 2025 05:52

Dotaz: Prazdne soubory do tar

6.2.2007 18:45 PetrK
Prazdne soubory do tar
Přečteno: 226×
Odpovědět | Admin
Ahoj,
asi to uvedu na prikladu. Dejme tomu ze mam /home/ferda/mp3/ a tam nekolikset mp3, a ja bych chtel udelat jejich seznam, tim ze ty soubory zabalim do tar, ale s nulovou velikosti(i s jejich cestou..). Da se to udelat nejak elegantne? Me napada jedine napred nekde vytvorit soubory se stejnym nazvem(ale prazdny) a ty pak zabalit.
dik.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Prcek avatar 6.2.2007 19:00 Prcek | skóre: 43 | Jindřichův Hradec / Brno
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Odpovědět | | Sbalit | Link | Blokovat | Admin
A samotny seznam souboru v textovem souboru by nestacil?

Pokud to chces udelat pres prazdne soubory, tak me napada treba skriptem cist vsechna jmena souboru v adresari a ty pak prikazem touch vytvaret (vytvori se soubor o nulove delce). Vyslednou hromadu prazdnych souboru pak muzes zabalit tarem.
Člověk je takový, jak vypadá... A já vypadám jako pravá, nefalšovaná děvka!!!
6.2.2007 21:09 iSteve | skóre: 15 | blog: isteve
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Odpovědět | | Sbalit | Link | Blokovat | Admin
A proc? Ponevadz sou tam i metadata? To je pitomost. Pouzij stat(1).

Pokud bys na tom trval, neni problem to napsat, tar format je celkem jednoduchej (kdyz pominem GNU aj. extenze), ale porad trvam na tom, ze je to pitomost:)
6.2.2007 23:18 PetrK
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Nj, ona to zase takova blbost neni:)
, asi hlavni duvod je zachovani stromove struktury. Nechci to pouzivat jen na mp3, a seznam jako
/home/ferda/mp3/VVV/sf.mp3

/home/ferda/mp3/VVV/ssf.mp3
/home/ferda/mp3/VVV/rsaf.mp3
/home/ferda/mp3/RSF/ad.mp3
.....


Akorat ze treba pro 1000 souboru se mi zdaj maximalne neprehledny:)
7.2.2007 06:10 iSteve | skóre: 15 | blog: isteve
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Ale ano, je -- nebo vubec nechapu, o co ti vlastne jde:) Presne stejne (nebo s relativnimi cestami, ale to umis samozrejme taky i jinak) je v taru ulozen seznam souboru taky. Muzes mi najit deset rozdilu mezi (krom lomitka na konci nazvu adresare, coz se da dodelat trivialne, pokud te nejak vic trapi):
isteve@silver:~$ tar -cf test1.tar ./junk/
isteve@silver:~$ tar -tf test1.tar 
./junk/
./junk/file1
./junk/file2
./junk/file3

a
isteve@silver:~$ find ./junk
./junk
./junk/file1
./junk/file2
./junk/file3
6.2.2007 21:22 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Odpovědět | | Sbalit | Link | Blokovat | Admin
S tím tarem si nejsem jistý. Myslím, že neumí zabalit obsah roury, takže možností je asi několik
# seznam souborů do souboru
find adresar -type -f -printf "%P\n" > seznam
# pripadne zatarovat
tar -cf seznam.tar seznam
# nebo radeji primo gzipnout
find adresar -type -f -printf "%P\n" | gzip > seznam.gz
# jde prohlizet pomoci zcat, zless, prohledavat pres zgrep, ...
zless seznam.gz
When your hammer is C++, everything begins to look like a thumb.
7.2.2007 00:36 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Odpovědět | | Sbalit | Link | Blokovat | Admin
Využiju toho, že se zde nedávno podobná věc řešila:

http://www.abclinuxu.cz/forum/show/167572#10

a jen trochu pozměním ten prográmek:
#!/usr/bin/env python
import os, sys
srcdir = os.path.realpath(sys.argv[1])
destdir = sys.argv[2]

srchead, srctail = os.path.split(srcdir)
srcheadlen = len(srchead)
newdir = os.path.join(destdir, srctail)
print 'creating root dir', newdir
os.mkdir(newdir)
for root, dirs, files in os.walk(srcdir):
    relroot = root[srcheadlen + 1:]
    for dirname in dirs:
        newdir = os.path.join(destdir, relroot, dirname)
        print 'creating dir ', newdir
        os.mkdir(newdir)
    for filename in sorted(files):
        newfile = os.path.join(destdir, relroot, filename)
        print 'creating file', newfile
Programu se zadávají dva parametry: cesta k originálnímu adresáři a cesta k adresáři, v němž se má udělat ta prázdná kopie.
7.2.2007 01:39 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Že mě to nenapadlo dřív! Vždyť python má přímou podporu pro zacházení s tarem (i tar.bz2), takže je možné projít celý strom a zaarchivovat ho, přičemž každé položce se nastaví nulová velikost. Všechny ostatní atributy se zachovají.
#!/usr/bin/env python
import tarfile, os, sys
tarname = sys.argv[1]
srcdir = os.path.realpath(sys.argv[2])
srchead, srctail = os.path.split(srcdir)
srcheadlen = len(srchead)

tar = tarfile.open(tarname + '.tar.bz2', 'w:bz2')
for root, dirs, files in os.walk(srcdir):
    relroot = root[srcheadlen + 1:]
    for item in dirs + files:
        fullpath = os.path.join(root, item)
        relpath = os.path.join(relroot, item)
        print fullpath, relpath        
        tarinfo = tar.gettarinfo(fullpath, relpath)
        tarinfo.size = 0
        tar.addfile(tarinfo)
tar.close()
Skriptu se zadají dva parametry: název archivu (bez koncovky) a cesta k adresáři pro archivaci. Vytvoří se soubor s koncovkou tar.bz2. A co mě úplně dostalo je to, že po rozbalení vznikne textový soubor, který připomíná výstup 'ls -l'. To jsem fakt nevěděl.
7.2.2007 23:13 PetrK
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
juu,
to je presne ono;) Jste moc hodnej. Sam bych to asi jen tak nenapsal:)
8.2.2007 07:41 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Keď máš kladivo, každý problém vyzerá ako kliniec ;-). Potrebujš python na to aby si urobil

cd /archive
mkdir -p `cd /home/ferda/mp3; find . -type d -print`
cd /home/ferda/mp3
find . -type f -exec touch /archive/{} \;
?
8.2.2007 10:09 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Python opravdu potřebuji, když nechci skript v shellu, který
-nefunguje, jsou-li v názvech adresářů mezery
-ničí informaci o datu a čase
-výsledek neuloží do taru
-musí procházet adresářový strom dvakrát
-pouští jeden externí program mockrát po sobě
-má v sobě natvrdo napsané cesty
-mění svůj vlastní pracovní adresář (ano, považuji to za špatné)
-běží pomaleji
-má mizivou možnost ladících výpisů
-je téměř nemožné nějak vylepšovat

Ale kdybych strašně spěchal a šlo mi o počet popsaných řádků, tak bych to možná v shellu napsal. Ale ono by se to časem vymstilo.
8.2.2007 18:16 PetrK
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Jsem tu zase:)
Maximalne s tebou souhlasim, jen jsem narazil jeste na jeden problem:(

Traceback (most recent call last):
File "All2tar.py", line 17, in ?
tar.addfile(tarinfo)
File "/usr/lib/python2.3/tarfile.py", line 1270, in addfile
raise ValueError, "name is too long (>%d)" \
ValueError: name is too long (>100)

Da se nejak dosahnout toho aby mu nevadilo vic jak 100 znaku v ceste? Dik
8.2.2007 19:06 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Aha, to je zrada. Máš starý python 2.3, který defaultně dodržuje posix standard a podle něj nesmí mít cesta v taru víc než sto znaků. Od Pythonu 2.4 už se přešlo na GNU rozšíření, které už takové omezení nemá. Pomoc je snadná - zakázat posix řádkem "tar.posix = False". Raději ukážu celý program:
#!/usr/bin/env python
import tarfile, os, sys
tarname = sys.argv[1]
srcdir = os.path.realpath(sys.argv[2])
srchead, srctail = os.path.split(srcdir)
srcheadlen = len(srchead)

tar = tarfile.open(tarname + '.tar.bz2', 'w:bz2')
tar.posix = False
for root, dirs, files in os.walk(srcdir):
    relroot = root[srcheadlen + 1:]
    for item in dirs + files:
        fullpath = os.path.join(root, item)
        relpath = os.path.join(relroot, item)
        print fullpath, relpath        
        tarinfo = tar.gettarinfo(fullpath, relpath)
        tarinfo.size = 0
        tar.addfile(tarinfo)
tar.close()
Bude to fungovat teď? To jsem sám zvědav.
9.2.2007 20:44 PetrK
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Jojo, ted to slape dobre a rychle. Diky moc:)

PS.: Na ten Python se budu muset taky poradne mrknout.
8.2.2007 14:54 Tomáš | skóre: 31 | blog: Tomik
Rozbalit Rozbalit vše Re: Prazdne soubory do tar
Odpovědět | | Sbalit | Link | Blokovat | Admin
Mozna blba otazka, uz jsi videl disksearch? http://disksearch.sourceforge.net/. Pokud jenom potrebujes mit seznam souboru s velikosti a hledat podle nazvu, tak je to presne ono. Ted jsem k tomu dodelaval podporu pro export do XML a tisk obalu CD/DVD (ale myslim, ze to Stefan jeste necommitnul).

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.