GNU/Linux >> Znalost Linux >  >> Linux

Jak de-rozbalit, De-tar -xvf — De-unarchive v chaotické složce?

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é?

  1. $ 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.

  2. Pokud je extrahováno malé množství souborů, jeden po druhém, pomalé, těžkopádné a náchylné k chybám.

  3. 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).

Související:Windows – Sdílená složka mezi hostem QEMU Windows a hostitelem Linuxu?
Linux
  1. Jak přesně duplikovat složku

  2. Jak zajistím, aby hledání vyloučilo složku, ve které hledá?

  3. Jak zjistit, kterou verzi Javy ve složce nainstalované Javy?

  1. Jak používat FIND v Linuxu

  2. Jak používat Unzip v Linuxu

  3. Jak najít soubor v Linuxu

  1. Linux – Jak zjistit, kterou verzi Javy v nainstalované složce Java?

  2. Jak najdu všechny odlišné přípony souborů v hierarchii složek?

  3. Jak mohu vytvořit soubor v každé složce?