Найти файлы и смолить их (с пробелами)
хорошо, так простая проблема здесь. Я работаю над простым резервным кодом. Он отлично работает, за исключением случаев, когда файлы имеют пробелы в них. Вот как я нахожу файлы и добавляю их в архив tar:
find . -type f | xargs tar -czvf backup.tar.gz
проблема в том, что файл имеет пробел в имени, потому что tar думает, что это папка. В принципе, есть ли способ добавить цитаты вокруг результатов поиска? Или другой способ исправить это?
8 ответов:
используйте этот:
find . -type f -print0 | tar -czvf backup.tar.gz --null -T -Это:
- работа с файлами с пробелами, новые строки, ведущие тире и другие забавности
- обрабатывать неограниченное количество файлов
- не будет повторно перезаписывать резервную копию.смола.ГЗ, как с помощью
tar -cСxargsбудут делать, когда у вас есть большое количество файловСмотрите также:
может быть другой способ достичь того, что вы хотите. В принципе,
- использовать найти команда для вывода пути к любым файлам, которые вы ищете. Редирект stdout к имени файла по вашему выбору.
затем tar с опцией-T, которая позволяет ему принимать список местоположений файлов (тот, который вы только что создали с помощью find!)
find . -name "*.whatever" > yourListOfFiles tar -cvf yourfile.tar -T yourListOfFiles
почему бы и нет:
tar czvf backup.tar.gz *конечно, это умно, чтобы использовать find, а затем xargs, но вы делаете это трудный путь.
Update: Porges прокомментировал с помощью опции поиска, которая, по моему мнению, является лучшим ответом, чем мой ответ, или другой:
find -print0 ... | xargs -0 ....
другое решение, как видно здесь:
find var/log/ -iname "anaconda.*" -exec tar -cvzf file.tar.gz {} +
лучшим решением, по-видимому, является создание списка файлов, а затем архивировать файлы, потому что вы можете использовать другие источники и делать что-то еще со списком.
например, это позволяет использовать список для вычисления размера архивируемых файлов:
#!/bin/sh backupFileName="backup-big-$(date +"%Y%m%d-%H%M")" backupRoot="/var/www" backupOutPath="" archivePath=$backupOutPath$backupFileName.tar.gz listOfFilesPath=$backupOutPath$backupFileName.filelist # # Make a list of files/directories to archive # echo "" > $listOfFilesPath echo "${backupRoot}/uploads" >> $listOfFilesPath echo "${backupRoot}/extra/user/data" >> $listOfFilesPath find "${backupRoot}/drupal_root/sites/" -name "files" -type d >> $listOfFilesPath # # Size calculation # sizeForProgress=` cat $listOfFilesPath | while read nextFile;do if [ ! -z "$nextFile" ]; then du -sb "$nextFile" fi done | awk '{size+=} END {print size}' ` # # Archive with progress # ## simple with dump of all files currently archived #tar -czvf $archivePath -T $listOfFilesPath ## progress bar sizeForShow=$(($sizeForProgress/1024/1024)) echo -e "\nRunning backup [source files are $sizeForShow MiB]\n" tar -cPp -T $listOfFilesPath | pv -s $sizeForProgress | gzip > $archivePath
Comments