Obvykle obnovuji věci pomocí $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip
ale někdy jsem líný a prostě dělám v libovolné složce $ unzip *.zip
takže si čas od času pohráváte s jiným obsahem. Uvedu zde některé metody — některé archivní verze mají určitě mizerné příznaky, zatímco jiné jsou více spartánské, mě zajímá spíše ta druhá.
Některé způsoby zrušení archivace, existují jiné?
-
$ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' ;
Slabinou je, že uvádí*.zip
dirs, takže musíte použít pomalé-ok
, pomalé s mnoha*.zip
shoduje se a z nějakého důvodu se nezdá, že by odpovídala všemu extrahovanému. -
Pokud je extrahováno malé množství souborů, jeden po druhém, pomalé, těžkopádné a náchylné k chybám.
-
Když se chci ujistit, zda je obsah archivu skutečně složka, někdy to zkontroluji pomocí
$ unzip -l *.bsd
, funguje alespoň v rozbalené verzi obsd.
Pokud odkazujete na určité archivační nástroje, uveďte je prosím, je-li to vhodné. Ať je to jednoduché – spíše mě zajímají ZPŮSOBY, jak to děláte, než jeden nástroj.
Přijatá odpověď:
Podle jména
Můžete vygenerovat seznam souborů v archivu a odstranit je, i když je to nepříjemně nešikovné u archivátorů, jako je unzip nebo 7z, které nemají možnost vygenerovat prostý seznam názvů souborů. I s tar to předpokládá, že v názvech souborů nejsou žádné nové řádky.
tar tf foo.tar | while read -r file; do rm -- "$file" done
unzip -l foo.zip | awk '
p && /^ --/ {p=2}
p==1 {print substr($0, 29)}
/^ --/ {++p}
' | while …
unzip -l foo.zip | tail -n +4 | head -n -2 | while … # GNU coreutils only
7z l -slt foo.zip | sed -n 's/^Path = //p' | while … # works on tar.*, zip, 7z and more
Místo odebírání souborů je můžete přesunout do jejich zamýšleného umístění.
tar tf foo.tar | while read -r file; do
if [ -d "$file" ]; then continue; fi
mkdir -p "/intended/destination/${file%/*}"
mv -- "$file" "/intended/destination/$file"
done
Použití FUSE
Namísto závislosti na externích nástrojích můžete (na většině unices) použít FUSE k manipulaci s archivy pomocí běžných příkazů souborového systému.
Pomocí Fuse-zip můžete nahlédnout do zipu a extrahovat jej pomocí cp
, vypište jeho obsah pomocí find
, atd.
mkdir /tmp/foo.d
fuse-zip foo.zip /tmp/foo.d
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd /tmp/foo.d && find . ! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm /tmp/foo.d/**(:"s~/tmp/foo.d/~~"^/)
## Extract the contents where you really want them
cp -Rp /tmp/foo.d /intended/destination
fusermount -u foo.d
rmdir foo.d
AVFS vytváří pohled na celou vaši hierarchii adresářů, kde všechny archivy mají přidružený adresář (stejný název s # na konci), který vypadá, že obsahuje obsah archivu.
mountavfs
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd ~/.avfs/"$PWD/foo.zip#" && find . ! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm ~/.avfs/$PWD/foo.zip#/**/*(:"s~$HOME/.avfs/$PWD/foo.zip#~~"^/)
## Extract the contents where you really want them
cp -Rp ~/.avfs/"$PWD/foo.zip#" /intended/destination
umountavfs
Podle data
Za předpokladu, že ve stejné hierarchii kromě vaší extrakce neproběhla žádná jiná aktivita, můžete extrahované soubory rozeznat podle jejich nedávného ctime . Pokud jste právě vytvořili nebo přesunuli soubor zip, můžete jej použít jako omezení; jinak použijte ls -lctr
k určení vhodného hraničního času. Pokud se chcete ujistit, že zipy neodstraňujete, není důvod provádět ruční schvalování:find
je dokonale schopen je vyloučit. Zde jsou příklady příkazů používajících zsh nebo find
; všimněte si, že -cmin
a -cnewer
Primary nejsou v POSIX, ale existují na Linuxu (a dalších systémech s GNU find), *BSD a OSX.
find . ! -name '*.zip' -type f -cmin -5 -exec rm {} + # extracted <5 min ago
rm **/*~*.zip(.cm-6) # zsh, extracted ≤5 min ago
find . -type f -cnewer foo.zip -exec rm {} + # created or moved after foo.zip
S GNU find, FreeBSD a OSX je dalším způsobem, jak určit čas ukončení, vytvořit soubor a použít touch
pro nastavení jeho mtime na čas cutoff.
touch -d … cutoff
find . -type f -newercm cutoff -delete
Namísto odstranění souborů je můžete přesunout do jejich zamýšleného umístění. Zde je způsob, jak najít pomocí GNU/*BSD/OSX, vytvořit adresáře v cíli podle potřeby.
find . ! -name . -cmin -5 -type f -exec sh -c '
for x; do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' /intended/destination {} +
Ekvivalent Zsh (téměř:tento reprodukuje celou hierarchii adresářů, nejen adresáře, které budou obsahovat soubory):
autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'
Upozornění, většinu příkazů v této odpovědi jsem netestoval. Před odstraněním vždy zkontrolujte seznam souborů (spusťte echo
nejprve, potom rm
pokud je to v pořádku).