'find -mtime -1 -print | xargs tar 'архивирует все файлы из каталога, игнорируя аргумент -mtime -1

Я пытаюсь создать сценарий резервного копирования. Мне удалось заставить этот скрипт работать отлично на машине CentOS 6.7, и теперь я пытаюсь заставить его работать правильно на Debian 7.

Я столкнулся с проблемой, которую я не могу решить с помощью Google или любой информации, найденной на этом сайте. Я попытаюсь объяснить свою ситуацию, прежде чем попасть в проблему.

В CentOS я использую следующую команду, чтобы найти файлы, которые были изменены за последние 24 часа в $SOURCEDIR и использовать xargs чтобы поместить только эти файлы в $ARCHIVE . Если файлы не найдены, появляется сообщение.

 find $SOURCEDIR -mtime -1 -print | xargs -r tar rcvf $ARCHIVE || { echo "No files have been changed in the past 24 hours. Exiting script ..." ; exit 1; } 

Я знаю, что использование tar rcvf может вызвать следующее сообщение об ошибке:

Вы не можете указать более одного параметра '-Acdtrux' или '–test-label'

Это, однако, похоже, не происходит на машине CentOS. Это делается на машине Debian, поэтому я удалил команду r из команды tar . Причина, по которой я добавил это в первую очередь, заключается в том, что я хочу избежать перезаписывания архива, если find вернет более 100 результатов.

Теперь о реальной проблеме. Всякий раз, когда я бегу

 find $SOURCEDIR -mtime -1 -print 

Я получаю список файлов, которые были изменены в $SOURCEDIR за последние 24 часа, как и ожидалось. Однако всякий раз, когда я запускаю полную команду, включая символ трубы и команду xargs например:

 find $SOURCEDIR -mtime -1 -print | xargs -r tar cvf $ARCHIVE || { echo "No files have been changed in the past 24 hours. Exiting script ..." ; exit 1; } 

Я действительно вижу, что команда find печатает все файлы из $SOURCEDIR прежде чем я получаю архив, содержащий все файлы из $SOURCEDIR , и я не понимаю, почему. Любая помощь будет принята с благодарностью.

4 Solutions collect form web for “'find -mtime -1 -print | xargs tar 'архивирует все файлы из каталога, игнорируя аргумент -mtime -1”

Как выяснили другие, проблема с вашей командой в том, что она включает в себя каталоги, а tar архивирует их рекурсивно. Если каталог был изменен в последнее время, все файлы в нем и его подкаталоги будут включены, независимо от того, были ли они изменены или нет.

Если вы не хотите создавать резервные копии метаданных каталога, просто скажите, не find ли имена каталогов. Недостаточно опустить корень: то же самое может случиться и с подкаталогами.

 find "$SOURCEDIR" -mtime -1 ! -type d -print | xargs -r tar -rcf "$ARCHIVE" 

Использование xargs терпит неудачу с именами файлов, содержащими пробелы и некоторые другие специальные символы . Это легко исправить: используйте -exec вместо xargs .

 find "$SOURCEDIR" -mtime -1 ! -type d -exec tar -rcf "$ARCHIVE" {} + 

Если вы хотите создать резервную копию метаданных каталога, откройте все, чтобы распечатать все, и вместо этого укажите tar чтобы не переписывать в подкаталоги. Поскольку find выполняет рекурсию, tar не нужно.

 find "$SOURCEDIR" -mtime -1 -exec tar -rcf "$ARCHIVE" --no-recursion {} + 

При таком подходе вы можете избежать использования tar -rc и вместо этого решить проблему повторных tar -rc tar, сначала создав архив только с корневым каталогом, а затем добавив его в пакеты. (Почему корневой каталог? Потому что GNU tar боится создать пустой архив.)

 tar -cf "$ARCHIVE" --no-recursion "$SOURCEDIR" find "$SOURCEDIR" -mindepth 1 -mtime -1 -exec tar -rf "$ARCHIVE" --no-recursion {} + 
 find $SOURCEDIR -mtime -1 

также включает $SOURCEDIR в выходе, который необходимо удалить до дальнейшей обработки

Используя grep -vx можно определить конкретную строку, которая будет исключена.

 find $SOURCEDIR -mtime -1 -print | grep -xv "$SOURCEDIR" | xargs -r tar cvf $ARCHIVE || { echo "No files have been changed in the past 24 hours. Exiting script ..." ; exit 1; } 

Вы не только xargs проблемами, если xargs дважды xargs tar , вы также столкнетесь с проблемами, если ваши имена файлов содержат специальные символы, такие как новые строки.

Вы должны отказаться от использования xargs и tar и использовать find cpio :

 find $SOURCEDIR -mtime -1 -print0 | cpio --create -0 --verbose \ --format=ustar -O $ARCHIVE 

ustar предоставляет ustar с POSIX.1 файл tar в $ARCHIVE .

Когда вы выполняете find $SOURCEDIR -mtime -1 -print он будет иметь в качестве первого результата папку $ SOURCEDIR. Вот почему все включено.
Вы должны исключить первый результат или $SOURCEDIR .

  • xargs, записи и стандартный ввод
  • Как создать несколько файлов tar с помощью сценария bash и использовать дату в качестве имен файлов?
  • Объединить xargs -I с sed
  • Удалите файлы, которые предоставляются по каналу
  • вывод технологического процесса на команду split by line и whitespace
  • Выполнить строки вывода команд в качестве другой команды в Linux
  • Почему «{}» и «%» обычно используются как переменные в xargs?
  • Почему параметр xargs -i устарел?
  • Как удалить файлы, отфильтрованные awk
  • Проверьте содержимое файла, ищущего повреждение, размер файла указывает размер «ноль»
  • Ускорение команды поиска rm с проверкой путем распараллеливания
  • Interesting Posts

    Получить имена пакетов для динамических наборов в Gentoo Linux

    Как сохранить пространство в литеральном выражении в значении массива в bash и как обрезать результаты из команды sort?

    Что делать, если результат из pipe не является последним аргументом в следующей команде

    Отладка сетевой проблемы Solaris

    идентификация встроенных разделяемых библиотек

    бесконечное активирующее состояние для пользовательской сборки openssh-hpn-sshd на ubuntu 16

    Centos 7: не удалось подключиться к сети: настроить интерфейс для интерфейса соединительной линии

    Как извлечь строку между Nth и Mth вхождениями шаблона?

    Разделение SAS с дисков SATA

    Почему x0vncserver не запускается при загрузке?

    Как создать ярлык для скрипта и запустить его как файл .desktop?

    Встроенный Debian-Linux, без часовой пояс

    Обновление linux + yum – что включает эта команда?

    Терминал против bash?

    CentOS без сетевого интерфейса после установки в VirtualBox

    Linux и Unix - лучшая ОС в мире.