Вы можете сделать это, чтобы предоставить tarсписок всех файлов внутри, protTestsкроме тех, которые являются символическими ссылками:
find protTests -maxdepth 1 -mindepth 1 -not -type l -print0 |
tar --null --files-from - -cvf protTests.tar
Кстати, ваша существующая команда:
tar -cvf protTests.tar protTests/*
архивировать не все файлы protTests, а только те, чьи имена не начинаются .(те, которые не скрыты). Оператор *glob пропускает файлы, имена которых начинаются с .конструкции. У команды также есть проблема, заключающаяся в том, что если в protTestsней много файлов (более многих тысяч), то она protTests/*может быть расширена до слишком большого числа аргументов, чтобы поместиться в командной строке.
У более простой команды, подобной этой, не было бы ни одной из этих проблем:
У Tar нет опций --files-from, это вариант от gtar, так что из вас дайте такой совет, лучше упомянуть, что это специфично для gtar. Поиск не имеет первичного -not, это еще один непереносимый GNUism. В общем, плохая идея использовать отдельный вызов find. Это может вызвать проблемы с забавными символами в имени файла, и это определенно дает низкую производительность, так как find и tar должны сканировать файловую систему. Эти проблемы не относятся к таким программам, как star, которые используют libfind и, следовательно, имеют встроенный код поиска.
Щили
Позвольте мне добавить еще один общий совет: когда вы даете совет, который относится к конкретному варианту программы UNIX для конкретного поставщика, целесообразно упомянуть поставщика и то, что он зависит от поставщика. Обычно это можно сделать, используя официальные названия программного обеспечения, например, gtar вместо tar, vim вместо vi. Обратите внимание, что это информационная платформа, связанная с UNIX, поэтому в целом примеры должны соответствовать стандарту POSIX.
Щили
Вы правы, @schily, это решение для GNU. Ваш ответ основан на starхорошей альтернативе, и по этой причине я проголосовал за него. Я также согласен с возражением против «забавных персонажей», но поскольку у GNU tarнет -0опции, это компромисс. Я не согласен с возражением по поводу производительности, это действительно не имеет значения в этой ситуации.
Селада
2
@schily, как GNU tarи bsdtarесть --files-fromи --nullчто снимает проблему с забавными персонажами (если в сочетании с find«s -print0или -exec printf '%s\0' {} +). Но здесь вы, вероятно, захотите добавить --no-recursionопцию. Некоторые paxреализации также имеют -0опцию.
Стефан Шазелас
2
@schily Я чувствую, что эта ветка комментариев не место для защиты различных версий tar. Пожалуйста, возьмите это в чат . Это уже слишком долго и читать как религиозную войну. Пока OP не вмешивается в этот момент, я не думаю, что это имеет значение, какая версия tarиспользуется. Мы даже не знаем, какой Unix они используют.
Типичная система Linux в наши дни пропускает много важного программного обеспечения после установки по умолчанию, и в то же время устанавливается много бесполезного программного обеспечения. Пользователь Linux должен знать, как установить отсутствующее программное обеспечение, и люди, которые часто используют tar, обычно все равно устанавливают звездочку.
июля
8
Подавляющее большинство людей, которые часто используют смолу, никогда не слышали о pax, не говоря уже о звездах.
Жиль "ТАК - перестань быть злым"
Ну, те люди, которые не знают, что они используют gtar в Linux, когда называют «tar», вероятно, не те люди, которым все равно. Star является самой старой бесплатной реализацией tar, и многие функции, встречающиеся в различных реализациях tar, были взяты из star, так почему бы не поговорить об оригинале?
--files-from
, это вариант от gtar, так что из вас дайте такой совет, лучше упомянуть, что это специфично для gtar. Поиск не имеет первичного-not
, это еще один непереносимый GNUism. В общем, плохая идея использовать отдельный вызов find. Это может вызвать проблемы с забавными символами в имени файла, и это определенно дает низкую производительность, так как find и tar должны сканировать файловую систему. Эти проблемы не относятся к таким программам, как star, которые используют libfind и, следовательно, имеют встроенный код поиска.star
хорошей альтернативе, и по этой причине я проголосовал за него. Я также согласен с возражением против «забавных персонажей», но поскольку у GNUtar
нет-0
опции, это компромисс. Я не согласен с возражением по поводу производительности, это действительно не имеет значения в этой ситуации.tar
иbsdtar
есть--files-from
и--null
что снимает проблему с забавными персонажами (если в сочетании сfind
«s-print0
или-exec printf '%s\0' {} +
). Но здесь вы, вероятно, захотите добавить--no-recursion
опцию. Некоторыеpax
реализации также имеют-0
опцию.tar
. Пожалуйста, возьмите это в чат . Это уже слишком долго и читать как религиозную войну. Пока OP не вмешивается в этот момент, я не думаю, что это имеет значение, какая версияtar
используется. Мы даже не знаем, какой Unix они используют.Моя реализация tar - лучший метод
источник
zsh: command not found: star
Когда вы упоминаете утилиты, о которых вам известно, что> 99% ваших читателей не будут в ваших системах, объясните, где их взять. И вы должны раскрывать свою принадлежность, когда упоминаете о своем собственном продукте (независимо от того, публикуете ли вы ссылку или нет, чтобы вы могли также опубликовать ссылку).