Mam plik .7z zawierający ~ 360 000 obrazów w wielu katalogach. Chciałbym przekonwertować go na plik .tar, aby móc go otworzyć na innym komputerze. Czy istnieje lepszy sposób niż wypakowanie go do plików i ponowne ich skompresowanie? Czy można dokonać bezpośredniej konwersji?
10
.7z
pliku na innym komputerze?Odpowiedzi:
Nie jest zbyt trudno napisać coś do roboty. Oto przykładowy skrypt Perla (wymaga modułu Archive :: Libarchive :: XS ).
Jeśli chciałeś tar.gz / tar.bz2 / tar.xz archiwum, należy dodać linię
archive_write_add_filter_gzip($out);
lubarchive_write_add_filter_bzip2($out);
czyarchive_tar_add_filter_xz($out);
poarchive_write_set_format
linii.To nie używa tymczasowego miejsca na dysku (tylko miejsce na wyjściowy plik tar) i bardzo mało pamięci RAM (tylko kilka MB dla perla, ale działa z plikami blok na raz, więc nie jest problemem, jeśli twoje pliki są większe niż pamięć RAM).
źródło
.7z
archiwa to archiwa często skompresowane przy użyciu pewnego rodzaju algorytmu, podczas gdy.tar
archiwa to tylko archiwa.Różnią się one zakresem, aw większości przypadków konwersja wymagałaby opcjonalnej dekompresji, po której zawsze następuje ekstrakcja archiwum źródłowego. Nawet jeśli
.7z
archiwum nie użyłoby żadnej kompresji, nadal wymagałoby wyodrębnienia.Biorąc to pod uwagę, jeśli chciałeś [zdekompresować] / wyodrębnić / ponownie zarchiwizować archiwum źródłowe, odpowiedź brzmi: nie możesz, przynajmniej nie używając domyślnych narzędzi Ubuntu, ponieważ
tar
nie możesz czytaćstdin
, więc nie możesz potokować7z
itar
. W każdym razie bardzo łatwo jest zautomatyzować wszystko za pomocą jednego polecenia:* <ścieżka_do_archiwum> = ścieżka do
.7z
archiwum źródłowegoRównież czas wymagany dla plików archiwum źródłowego mają być zapisane na dysku i dla wyodrębnionych plików do odczytu, aby [dekompresji] / wyciąg / rearchive archiwum źródło w dwóch etapach jest wąskim gardłem dla całego zadania głównie (altough nie tylko) z powodu niskiej prędkości we / wy potencjalnego dysku, więc częściowym rozwiązaniem byłoby przechowywanie plików tymczasowych na ramdysku w celu prawie całkowitego zlikwidowania wąskiego gardła:
sudo mkdir /mnt/tmpfs
sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk
* <tmpfs_size> = rozmiar systemu plików w bajtach * 10 3 (1, 1K, 1M, 1G, ...)mkdir /mnt/tmpfs/tmp && 7z x <path_to_source_archive> -o/mnt/tmpfs/tmp && tar cf archive.tar /mnt/tmpfs/tmp && rm -rf /mnt/tmpfs/tmp
* <ścieżka_do_archiwum> = ścieżka do.7z
archiwum źródłowegosudo umount
sudo rmdir /mnt/tmpfs
źródło