Командование
find my_directory/ -maxdepth 1 -printf "%P\n" | tar -cvf my_archive.tar -C my_directory/ -T -
Это создает стандартный архивный файл. Стандартный способ, которым файлы и каталоги, которые вы хотите упаковать, находятся в корне архива. Нет никаких дополнительных специальных файлов, таких как '.' и dirs как ./
перед каждым './file'.
Пробуя так много решений, которые уже есть, только с одним успешно, мне кажется, что использование find
или, возможно, других команд, таких как ls -A -1
, в левой части канала (- 1 как «один», а не -l как «L») - единственный способ достичь вышеуказанной цели.
Если tar-файл в дальнейшем обрабатывается или доставляется кому-то в качестве продукта моей работы, я не хочу, чтобы там были какие-то странности.
Описание аргументов
-maxdepth 1
По убыванию не более чем на 1 уровень - без рекурсии.
-printf
вывести формат на стандартный вывод
%P
Имя файла с именем начального - точка, ниже которой он был обнаружен, удален.
\n
Новая строка
printf не добавляет новую строку в конец строки. Это должно быть добавлено сюда
tar:
-C DIR
, --directory=DIR
перейти в каталог DIR
-T FILE
, --files-from=FILE
получить имена для извлечения или создания из ФАЙЛА
-
этот ФАЙЛ сверху является стандартным вводом из канала
Комментарии к другим решениям.
Тот же результат может быть достигнут с помощью решения, описанного @aross.
Отличие от решения здесь в том, какой инструмент выполняет рекурсию. Если вы оставите задание find
, каждое имя пути к файлу будет проходить через конвейер. Он также отправляет все имена каталогов, которые tar с параметром --no-recursion игнорирует или добавляет как пустые, за которыми следуют все файлы в каждом каталоге. Если при чтении файла из find
произошел неожиданный вывод в виде ошибок, tar не узнает и не позаботится о том, что происходит.
Но с дальнейшими проверками, такими как обработка потока ошибок из find, это может быть хорошим решением, когда много опций и фильтров на файлах.
Я предпочитаю оставить рекурсию на tar, это кажется более простым и более стабильным решением.
С моей сложной структурой каталогов я уверен, что архив будет готов, когда tar будет не сообщать об ошибке.
Другое решение с использованием find
, предложенное @serendrewpity, кажется прекрасным, но оно не работает с именами файлов с пробелами. Разница в том, что вывод find
, предоставленный суб-оболочкой $ (), разделен пробелами. Можно было бы добавить кавычки с помощью printf, но это еще больше усложнило бы инструкцию.
Нет причин делать cd в my_directory, а затем обратно при использовании ../my_archive.tar в качестве пути tar, потому что TAR имеет команду -C DIR
, --directory=DIR
, которая существует только для этой цели.
Использование .
(точка) будет включать точки
Использование * позволит оболочке предоставить список входных файлов. Возможно, с помощью параметров оболочки можно будет включить точечные файлы. Но это сложно. Команда должна выполняться в оболочке, которая позволяет это. Включение и отключение должно выполняться до и после команды tar. И это не удастся, если корневой каталог будущего архива будет содержать слишком много файлов.
Этот последний пункт также относится ко всем решениям, в которых не используется pipe.
Большинство решений создают каталог внутри, в котором находятся файлы и каталоги. Это вряд ли когда-либо желательно.
person
papo
schedule
19.12.2020
tar -czf
? В моем случае это только файлы, а не каталог. Когда я простоtar
каталог, он включает его, но сtar -czf
он только добавляет файлы. - person Durga Swaroop   schedule 05.01.2017