Я, вероятно, могу написать сценарий оболочки только для поиска файлов, затем передать список в tar, но мне интересно, есть ли уже встроенная функция в tar, которая позволяет делать это только в одной командной строке?
Например, я нашел --no-recursion
переключатель, но когда я делаю:
tar --no-recursion -cvf mydir.tar mydir
Он только архивирует имена записей в каталоге (включая подкаталоги!), Но не архивирует файлы.
Я также попробовал:
tar --no-recursion -cvf mydir.tar mydir/*
Но в то время как он архивирует только файлы, он также архивирует имена подкаталогов.
Есть ли способ указать только файлы tar, без каталогов?
find mydir -type f |xargs cp -t tempdir
и затем tar tempdir.find mydir -depth 1 -type f | xargs tar cf mydir.tar
find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +
. В+
путы все файлы на той же командной строке , как xargs.Ответы:
Как указывает camh, предыдущая команда имела небольшую проблему в том, что, учитывая слишком много имен файлов, она выполнялась более одного раза, а последующие вызовы молча стирали предыдущие запуски. Поскольку мы тоже не сжимаем, мы можем добавить вместо перезаписи:
Ответ Iocnarz в использования
tar
«s--null
и-T
параметры работы , а также. Если выcpio
установили, ответ Camh с его помощью тоже хорошо. И если у вас естьzsh
и не против использовать его для команды, ответ Жиля с использованием zsh glob (*(.)
) кажется наиболее простым.Ключ был
-maxdepth
вариант. Окончательный ответ, относящийся к пробелам соответственно:Это также должно работать:
источник
tar
. Какxargs
иfind
с+
вариантом имеет максимальное количество аргументов , которые могут быть переданы дегтем. Это приведет к тому, что второй вызов tar перезапишет вывод первого.-x
для принудительного сбоя xargs вместо потери данных, и хотя это лучше, чем ошибка потери данных без вывода сообщений, она все же не идеальна. Эта ошибка сортировки очень опасна, потому что сначала все выглядит нормально, но со временем список файлов растет, вы начинаете его запускать и можете не заметить, пока не попытаетесь восстановить резервную копию. Тогда уже поздно.Когда вы хотите использовать
find
сtar
, лучший способ - использоватьcpio
вместоtar
.cpio
может писать архивы tar и предназначен для получения списка файлов для архивирования из stdin.Использование
find
иcpio
является более unix-y подходом в том смысле, что вы позволяетеfind
делать выбор файла со всей его мощью иcpio
архивировать. Стоит научиться этому простому использованиюcpio
, так как вам легко решать проблемы, с которыми вы сталкиваетесь при попыткеtar
.источник
-maxdepth
раньше-type
.Я не уверен, что понимаю ваши требования. Если вы хотите хранить обычные файлы в
mydir
подкаталогах, но не в их подкаталогах, самый простой способ - использовать zsh, где сопоставление только обычных файлов - простой вопрос использования.
спецификатора glob :источник
Вы можете даже использовать
find ... -print0
иtar ... --null
напрямую, не используяxargs
вообще.В данном примере
--no-recursion
опция totar
не обязательна, потому что только пути файлов (а не каталогов) будут переданы изfind
вtar
.Однако использование
--no-recursion
опции totar
в следующем примере предотвращаетtar
двойное архивирование каталогов.find
будет делать рекурсию дерева каталогов вместоtar
.источник
Как
man tar
говорится во вступительном абзаце (последнее предложение),Который я понимаю как «нет» ответ на ваш вопрос.
источник
--no-recursion
,--exclude-tag
и т. Д.). Я смотрю на то,--exclude-tag
что выглядит многообещающе, но, кажется, является полной противоположностью того, что я ищу.Пропустите
-C startdir
и замените.
на,startdir
если оно должно появиться в архиве.Это наиболее эффективный метод, основанный на возможностях libfind. Libfind также предлагает основные цвета,
-chown
-chgrp
-chmod
которые изменяют struct stat и позволяют архивировать различные метаданные. Это также работает в режиме списка и извлечения и во многих случаях избавляет от необходимости извлекать весь архив.источник
-find
в-copy
режиме. Краткий обзор справочной страницы предполагает, что вы можете, но я не смог заставить его работать (пытаясь ответить на вопрос Как скопировать измененные файлы при сохранении структуры папок ) (с schily-2016-02-10)star -find
.Я мог бы найти решение.
find mydir -type f -printf '%P\0'|tar czvf mydir.tar.gz -C mydir --null -T -
Это может быть немного дорого, но в любом случае это будет работать, потому что это не зависит от xargs.
источник
dir = your_dir; CD $ DIR; tar -cvf file.tar `найти. -maxdepth 1-type f -print`
источник