'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 , и я не понимаю, почему. Любая помощь будет принята с благодарностью.

  • Синтаксис командной строки для перенаправления аргументов?
  • Пропустить входной файл через трубу в качестве аргумента?
  • Удалите все повторяющиеся слова из строки, используя сценарий оболочки
  • Почему xargs -I подразумевает -L 1
  • Странная ошибка «Нет такого файла» с «xargs» и «file»
  • Как вы можете перемещать или копировать определенные файлы из списка текстовых файлов
  • Выполнить строки вывода команд в качестве другой команды в Linux
  • GNU параллельна чрезмерно медленной
  • 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 .

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