Вот документированные инструкции по установке Gentoo из архива stage3:
Вы можете указать tar
не возвращаться к своим аргументам, а затем использовать find
, чтобы предоставить ему каждый каталог в качестве аргумента. Итак, что-то вроде этого:
find. -type d -print0 | xargs -0 tar --no-recursion -cf your_tree.tar
-print0
и -0
предназначены для того, чтобы избежать проблем с каталогами, в имени которых есть пробелы и другие специальные символы.
Как указано в комментариях ниже, если у вас много каталогов, то командная строка станет слишком большой и tar
будет вызываться несколько раз. В этом случае вы могли бы вместо этого прочитать аргументы, используя--files-from
:
find. -type d -print0 | tar --null --no-recursion --files-from - -cf your_tree.tar
Редактировать:
Вышеупомянутое было написано до того, как ОП пояснил, что им нужен набор файлов tar в каталоге верхнего уровня. Я думаю, что описанная выше техника все еще может быть использована для достижения этой цели. Например:
$ mkdir -vp tree/a/b/c tree/foo/bar/baz
mkdir: created directory ‘tree’
mkdir: created directory ‘tree/a’
mkdir: created directory ‘tree/a/b’
mkdir: created directory ‘tree/a/b/c’
mkdir: created directory ‘tree/foo’
mkdir: created directory ‘tree/foo/bar’
mkdir: created directory ‘tree/foo/bar/baz’
$ touch tree/foo/an_unwanted_file
$ cd tree
/var/tmp/tree
$ for dir in $(find. -maxdepth 1 -type d); do if [ "$dir" != "." ]; then find "$dir" -type d -print0 | tar --null --no-recursion --files-from - -cvf "${dir}.tar"; fi; done
./a/
./a/b/
./a/b/c/
./foo/
./foo/bar/
./foo/bar/baz/
$ tar tvf foo.tar
drwxr-xr-x andy/andy 0 2018-11-29 12:30./foo/
drwxr-xr-x andy/andy 0 2018-11-29 12:30./foo/bar/
drwxr-xr-x andy/andy 0 2018-11-29 12:30./foo/bar/baz/
$ tree
.
├── a
│ └── b
│ └── c
├── a.tar
├── foo
│ ├── an_unwanted_file
│ └── bar
│ └── baz
└── foo.tar
Я рекомендую использоватьstar
(Я автор star
, которая является самой старой реализацией бесплатного tar):
star cf file.tar -find. -type d
Это работает для любого количества имен в файле tar, так как star
используетlibfind
-
for dir in A/B/C/*/; do
name=$(basename "$dir")
tar -cv -f "$name.tar" -C A/B/C "$name"
done
Это создаст архив для каждого отдельного (не -скрытого )подкаталога в A/B/C
. Архивы будут созданы в текущем каталоге.
Опция -C
позволяет tar
установить рабочий каталог для следующих файлов($name
).
Вы можете использовать -C "$(dirname "$dir")"
вместо -C A/B/C
для более общего кода.
Для создания архивов в подкаталоге C
( cd A/B/C &&
for dir in */; do
tar -cv -f "${dir%/}.tar" "$dir"
done )
Подоболочка вокруг всей команды предотвращает изменение рабочего каталога в остальной части оболочки/скрипта, а ${dir%/}
удаляет косую черту в конце значения в $dir
.
К сожалению, опция -C
не влияет на рабочий каталог для архивного файла, указанного в -f
, иначе мы могли бы просто переместить бит -C
перед опцией -f
.
Альтернативно, как вариант первого цикла:
for dir in A/B/C/*/; do
name=$( basename "$dir" )
( cd "$( dirname "$dir" )" && tar -cv -f "$name.tar" "$name" )
done