![Как заархивировать несколько папок, некоторые рекурсивно, некоторые нерекурсивно](https://rvso.com/image/1597819/%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%B0%D1%80%D1%85%D0%B8%D0%B2%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%BF%D0%B0%D0%BF%D0%BE%D0%BA%2C%20%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE%2C%20%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5%20%D0%BD%D0%B5%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE.png)
У меня есть список каталогов. Некоторые из каталогов требуют рекурсивного тарирования, другие требуют только файл, который существует в этом каталоге, без подкаталогов: Используя каталог/файлы ниже в качестве примера, как будет выглядеть моя команда tar:
/tmp/dir1/ - Recursively
/tmp/dir2/ - Only the files that exist in that directory, no subdirectories
/tmp/dir3/file1 - Only this single file.
решение1
Вот что у меня получилось:
Сначала структура каталогов, которую я использую в качестве примера:
$ find dir1 dir2 dir3 -print
dir1
dir1/file1
dir1/file2
dir1/sub_dir1
dir1/sub_dir1/file1
dir2
dir2/file1
dir2/file2
dir2/sub_dir1
dir2/sub_dir1/file1
dir3
dir3/file1
$
Далее мое решение, которое состоит из трех команд:
Первая команда:
tar cvf archive.tar dir1
Довольно стандартно. Давайте разберем:
c
- Создаватьv
- Многословный (давайте посмотрим, что происходит)f
- желаемое имя файла, в нашем случаеarchive.tar
archive.tar
- этот фактический аргумент к нашемуf
переключателюdir1
- что мы хотим на самом деле покрыть гудроном
Вторая команда:
find dir2 -maxdepth 1 -type f -print0 | xargs -0 tar rvf archive.tar
Давайте разберем это:
find dir2
- Где мы хотим найти для поиска.-maxdepth 1
- Не опускайтесь ниже глубины 1 (оставайтесь в корнеdir2
)-type f
- Поиск файлов-print0
- Не выводите символ новой строки в конце, вместо этого используйте нулевой символ. Это помогает нам, если find находит файлы с пробелами.| xargs -0
- Стандартный ввод, который мы нашли с помощью команды find, помещается сюда для выполнения с учетом нашихprint0
tar rvf
- Единственный новый переключатель здесь -r
. Это наша опция добавления. Она добавляется к нашемуarchive.tar
в конце. Не путать с опциейA
, которая относится только к добавлению дополнительных архивов (.tar
-s).archive.tar
- Tar, к которому мы хотим присоединиться.В конце этой команды используется наш stdinput. Например:
archive.tar <stdinput>
Третья команда:
tar rvf archive.tar dir3/file1
Добавить в archive.tar
один файл ( file1
) из dir3
.
И наконец, как выглядит tar после создания. Опция t
используется для распечатки его содержимого.
$ tar tvf archive.tar
drwxrwxr-x mmallard/mmallard 0 2019-07-18 16:02 dir1/
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:01 dir1/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:01 dir1/file2
drwxrwxr-x mmallard/mmallard 0 2019-07-18 16:02 dir1/sub_dir1/
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir1/sub_dir1/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir2/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir2/file2
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir3/file1
$