Jak spakować pliki jako folder
Mam strukturę plików podobną do tej:
- root_folder_with_bad_name
- file1
- file2
- file3
Potrzebuję archiwum zip o tej strukturze:
- archive.zip
- some_folder
- file1
- file2
- file3
Nie znam nazwy folderu root_folder, więc nie mogę po prostu tego zrobić:
zip archive.zip some_root_folder_name
Chcę mieć możliwość spakowania plików znajdujących się w tym folderze. Jak mogę to zrobić?
Odpowiedzi
Wydaje się, że chcesz przechowywać pliki w ziparchiwach o innych nazwach lub ścieżkach niż oryginały. Oprócz całkowitego usunięcia ścieżki, modyfikowanie ścieżek lub nazw zipplików w plikach nie wydaje się być możliwe przy użyciu powszechnie dostępnych narzędzi.
Aby obejść ten problem, możesz utworzyć żądaną strukturę katalogów w folderze tymczasowym za pomocą twardych łączy.
(Nie mam pojęcia, dlaczego ludzie odwołują się do tari gzip. Nie mają one znaczenia, ponieważ wyraźnie zaznaczasz, że chcesz zippliki.)
Możesz utworzyć tymczasową hierarchię katalogów z nazwą docelowego folderu archiwum, spakować ją, a następnie usunąć.
Działa to przy bashzałożeniu, że nie ma katalogu (lub pliku) już nazwanego archivew bieżącym katalogu
(
shopt -s extglob
mkdir archive &&
cp -al !(archive) archive &&
zip -r archive.zip archive
rm -rf archive
)
Zauważ, że nowa hierarchia katalogów jest łączona, a nie kopiowana, więc (a) jest szybka, (b) nie zajmuje znaczącej dodatkowej przestrzeni dyskowej.
Przykład praktyczny
# Set up the files in a directory
mkdir secret_name; touch secret_name/file{1,2,3}
cd secret_name/
# Now create the archive
( shopt -s extglob; mkdir archive && cp -al !(archive) archive/ && zip -r archive.zip archive; rm -rf archive )
# List the archive
unzip -l archive.zip
Archive: archive.zip
Length Date Time Name
--------- ---------- ----- ----
0 2020-10-16 19:21 archive/
0 2020-10-16 19:12 archive/file2
0 2020-10-16 19:12 archive/file3
0 2020-10-16 19:12 archive/file1
--------- -------
0 4 files
Możesz użyć libarchive bsdtari jego -sopcji, aby edytować ścieżki plików dodanych do archiwum:
$ ls file1 file2 file3 $ bsdtar --format=zip -'s|^\.|some_folder|' -cf ../file.zip .
$ unzip -l ../file.zip
Archive: ../file.zip
Length Date Time Name
--------- ---------- ----- ----
0 2020-10-16 21:15 some_folder/
0 2020-10-16 21:15 some_folder/file1
0 2020-10-16 21:15 some_folder/file3
0 2020-10-16 21:15 some_folder/file2
--------- -------
0 4 files
Wydaje się, że działa to również przy użyciu dowiązania symbolicznego, bez kopiowania plików.
> ls old_parent/
file1 file2
> ln -s old_parent new_parent
> zip -r archive.zip new_parent
adding: new_parent/ (stored 0%)
adding: new_parent/file2 (deflated 22%)
adding: new_parent/file1 (deflated 38%)
> unzip -l archive.zip
Archive: archive.zip
Length Date Time Name
--------- ---------- ----- ----
0 2020-10-16 22:48 new_parent/
50 2020-10-14 08:18 new_parent/file2
348 2020-10-16 13:58 new_parent/file1
--------- -------
398 3 files
> rm new_parent