2017-01-14 16 views
0

Когда следующая команда запускается из ошибок crontab tar, возникают, когда встречается файл с пробелами в имени файла.tar имена файлов с пробелами в одной строке crontab style tar/find command

/tar -C/-zcvf /root/archive-of-files-with-spaces-in-filename.tar.gz `find /var/www/html -mmin -1450 -print | sed 's|^/||'` 

Изменение переключатель -print0 или удаление -print переключатель вообще не решает проблему:

/tar -C/-zcvf /root/archive-of-files-with-spaces-in-filename.tar.gz `find /var/www/html -mmin -1450 -print0 | sed 's|^/||'` 

ИЛИ

/tar -C/-zcvf /root/archive-of-files-with-spaces-in-filename.tar.gz `find /var/www/html -mmin -1450 | sed 's|^/||'` 

Те же ошибки выбрасываются дегтем.

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

Пример ошибки, полученного с именем файла: "2016-12-15 Ремонт Имя файла exportICS.php"

дегтя: вар/WWW/html-calendar.northpawfamilycloud.xyz/страницы/2016-12- 15: не может стат: нет такого файла или каталога
дегтя: Имя: не может стат: нет такого файла или каталога
дегтя: файл: не может стат: нет такого файла или каталога
дегтя: Ремонт: не может стат: нет такого файл или каталог
tar: exportICS.php: Не удается установить: нет такого файла или каталога

ПРИМЕЧАНИЕ | SED «s | ^/||» `полосы слэш от находит так дегтя ошибка«удаление слэша не происходит

+0

Почему у вас есть «tar» в корневом каталоге? Это странное место для хранения исполняемого файла. –

+0

в crontab в командной строке 1 1 * * */bin/tar Я тестирую в командной строке с # tar as/bin в переменной среды PATH моего сервера – ml48603

ответ

1

Поскольку только фильтрация вы делаете, чтобы удалить ведущие косые черты из имен под /var/www/html, вы можете использовать tar в одиночку - избежать мириады проблем с find:

tar -C/-czvf /root/archive-of-files-with-spaces-in-filename.tar.gz var/www/html 

Учитывая directory, tar создает резервные копии содержимого каталога. Если у вас есть подкаталоги под /var/html, ваш архив, вероятно, в два раза больше, чем необходимо. Это не будет больше, чем необходимо.


Видимо, команда find включает в себя варианты.В этом случае, вы должны сделать что-то по-другому:

(cd /; find var/www/html -type f -mmin -1450 -print0) | 
tar -C/--null -T - --czvf /root/archive-of-files-with-spaces-in-filename.tar.gz 

cd /; find var/html избегает ведущих слеши из find. -print0 использует нулевые терминаторы для имен файлов. --null сообщает tar, чтобы имена файлов были пустыми; -T - говорит, что читает список имен файлов со стандартного ввода.

Вы можете поместить все это на одной линии, если хотите. Это не так, как я бы это сделал. Я бы создал скрипт, который будет запускаться системой cron (crontab), которая выполняла бы эту работу, тем более, что имя выходного файла неизбежно было бы отмечено с отметкой времени, если бы я ее запускал, и это, вероятно, определит, какой сайт подкрепляется и т. д. Резервное копирование сайта будет параметром для скрипта, предоставленного записью crontab. Это мое предпочтение; есть много людей, которые пишут длинные строки в свои файлы crontab.

Кроме того, GNU tar (грохот) опускает ведущую косую черту из архивных имен, так что никогда не абсолютные имена внутри tar файла, созданного с помощью GNU tar:

tar: Removing leading `/' from member names 

Это означает, что вы могли бы избежать суб- shell и просто используйте find /var/www/html … для генерации имен, живущих с предупреждающим сообщением. Так как у вас есть подробный вывод, это вряд ли будет проблемой.

+0

Я представил команду tar с помощью find, потому что я обычно добавляю ключи в find, чтобы включить различные инкрементные методы резервного копирования, такие как добавление -mmin -1450 в инструкцию find только для архивирования файлов с временными отметками изменения времени 24 часа 10 минут. – ml48603

+0

/var/www/html содержит один небольшой сайт// var/ww/html1 содержит следующий сайт smal и т. Д. – ml48603

+0

Эта команда работала как чемпион. Благодаря! – ml48603

0

архив с пробелами:

Побег пространства с обратной косой чертой или цитировать имя файла Пример.. :

tar czvf /my/path/filename\ with\ spaces.tgz files... 

Если файлы будут заархивированы пробелы в именах:

Использование find ... -print0 для разделения имен файлов с NUL L tar ... --null рассматривать только файлы с завершенным NULL. Из GNU tar documentation:

find /path ... -print0 | tar ... --null -T - 
+0

Этого не хватает. Проблема не в имени архива - в любом случае в нем нет пробелов. Проблема заключается в обработке записей в 'files ...', которые имеют пробелы в имени. –

+0

Это будет работать с tar одним файлом с пробелами, но не подходит для команды tar'ing сотен файлов одновременно. – ml48603

+0

@ JonathanLeffler: да, вы правы. Я отредактировал свой ответ. – mauro