tar: сжать и удалить оригинальные файлы и оставить каталоги нетронутыми - PullRequest
0 голосов
/ 05 ноября 2019

Я нахожусь в каталоге, содержащем:

f0 f1 f2 .h1 .h2 .h3 / tmp

Я хочу tar tar все файлы и удалить оригинальные файлы. Я не хочу ни tar, ни tmp, ни трогать его файлы. После публикации https://unix.stackexchange.com/questions/24870/tar-files-only-no-directories, похоже, что прямого способа сделать это не существует, поэтому я попробовал следующее:

find . -maxdepth 1 -type f -exec tar cvf test.tar {} --remove-files \;

это почти работает:

- архив создан

- все файлы удалены

- / tmp остается нетронутым

но

в моем архиве есть только файл f2 (!)

Я нашел очень уродливое решение:

find . -maxdepth 1 -type f -exec tar cvf test.tar {} \; && find . -maxdepth 1 -type f ! -name '*.tar' -exec shred -xuvz {} \;

, но что-то более элегантное было бы очень признательно.

спасибо, ребята!

1 Ответ

1 голос
/ 05 ноября 2019
find . -maxdepth 1 -type f -exec tar cvf test.tar {} --remove-files \;

почти работает, но

в моем архиве есть только файл f2 (!)

Да, потому что *Команда 1010 * выполняется отдельно для каждого обнаруживаемого файла find, а опция c для tar заставляет его каждый раз создавать новый архив.

Существует несколько способов приблизиться к этому, но дляне слишком большое количество файлов, вы можете объединить find с xargs, чтобы выполнить одну команду для всех файлов, выбранных с помощью find:

find . -maxdepth 1 -type f | xargs tar cvf test.tar --remove-files

Это хороший шаблон, который нужно знать, ноу него есть несколько ограничений. В частности,

  • xargs объединит множество аргументов, считанных из его стандартного ввода, в меньшее количество команд, но существуют ограничения, зависящие от системы и данных, от того, сколько их можно сформироватьв команду single , которая вам нужна. Если эти пределы превышены, xargs отправит несколько команд, которые вернут вас туда, откуда вы начали. Но эти ограничения, как правило, намного больше, чем необходимо для примера.

  • Имена файлов с пробелами в них нарушат этот шаблон, поскольку xargs обычно разделяет свои входные данные в пробелах. Однако если у вас есть find и xargs, которые его поддерживают, то вы можете обойти это, используя предикат -print0 в команде find и параметр -0 для xargs вместе. Конечно, это не проблема, если у вас нет таких имен файлов.

...