Можно ли использовать только суб-каталоги, исключая другие файлы в папке?

Вот документированные инструкции по установке Gentoo из архива stage3:

Установка архива stage

0
29.11.2018, 14:52
3 ответа

Вы можете указать 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
1
28.01.2020, 02:41

Я рекомендую использоватьstar(Я автор star, которая является самой старой реализацией бесплатного tar):

star cf file.tar -find. -type d

Это работает для любого количества имен в файле tar, так как starиспользуетlibfind-

-1
28.01.2020, 02:41
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
1
28.01.2020, 02:41

Теги

Похожие вопросы