Исключить только указанную c папку в команде tar - PullRequest
0 голосов
/ 09 января 2020

Я хочу скопировать каталог, который выглядит следующим образом:

dir
└── workspace
└── node_modules
└── subfolder
    └── workspace
    └── node_modules
    └── other_folder

Я хочу исключить все папки с именем node_modules и исключить папку верхнего уровня с именем workspace, но нет подпапок с именем workspace. Итак, я хочу закончить так:

dir
└── subfolder
    └── workspace
    └── other_folder

Я запускаю эту команду: tar -czf ./output.tar.gz --exclude=node_modules --exclude=./workspace dir/.

Но она удаляет все папки, называемые рабочим пространством и node_modules, так что вместо этого я получаю следующее:

dir
└── subfolder
    └── other_folder

Как мне удалить только нужную папку рабочей области c, а не все папки с одинаковыми именами?

Ответы [ 2 ]

1 голос
/ 09 января 2020

find имеет много-много-много опций для включения, исключая пути, файлы, каталоги, обычно параметры фильтрации, как вы хотите.

В вашем случае я думаю, что это будет:

# exclude all folders named node_modules
# exclude the top level folder called workspace
# but no sub folders called workspace
find dir -type f \
    -not -regex '.*/node_modules/.*' -a \
    -not -regex 'dir/workspace/.*' \
    -exec tar -czf ./output.tar.gz {} +

Вы можете предпочесть вместо -exec например find ... -print0 | xargs -0 tar -czf ./output.tar.gz. Я думаю, что лучше всего будет find ... -print0 | tar -czf ./output.tar.gz --null -T -, так как он не потерпит неудачу, если будет слишком много файлов, ie. я думаю, слишком много аргументов для передачи tar.

Я воссоздал каталог dir с:

while read l; do
    mkdir -p "$(dirname "$l")"
    touch "$l"
done <<EOF
dir/workspace/1.txt
dir/node_modules/2.txt
dir/subfolder/workspace/3.txt
dir/subfolder/node_modules/4.txt
dir/subfolder/other_folder/5.txt
EOF

, затем протестирован на repl и tar -tf ./output.tar.gz отпечатки:

dir/subfolder/workspace/3.txt
dir/subfolder/other_folder/5.txt
0 голосов
/ 09 января 2020

В необходимом случае возможное использование tar исключает:

  • --exclude dir/./folder - применить к папке непосредственно в директории dir
  • --exclude folder - исключить папку в любом месте Дерево

Должно быть возможно использовать:

tar -czf ./output.tar.gz --exclude=node_modules --exclude=dir/./workspace dir/.

Конечно, можно использовать --files-from, а для генерации списка использовать другой инструмент. Обычно это предпочтительнее, когда в списке может быть большое количество файлов, вместо использования xargs.

find dir/. -type f ... | tar cvz ./output.tar.gz -T-
...