Найти файлы и смолить их (с пробелами)



хорошо, так простая проблема здесь. Я работаю над простым резервным кодом. Он отлично работает, за исключением случаев, когда файлы имеют пробелы в них. Вот как я нахожу файлы и добавляю их в архив tar:



find . -type f | xargs tar -czvf backup.tar.gz 


проблема в том, что файл имеет пробел в имени, потому что tar думает, что это папка. В принципе, есть ли способ добавить цитаты вокруг результатов поиска? Или другой способ исправить это?

621   8  

8 ответов:

используйте этот:

find . -type f -print0 | tar -czvf backup.tar.gz --null -T -

Это:

  • работа с файлами с пробелами, новые строки, ведущие тире и другие забавности
  • обрабатывать неограниченное количество файлов
  • не будет повторно перезаписывать резервную копию.смола.ГЗ, как с помощью tar -c С xargs будут делать, когда у вас есть большое количество файлов

Смотрите также:

может быть другой способ достичь того, что вы хотите. В принципе,

  1. использовать найти команда для вывода пути к любым файлам, которые вы ищете. Редирект stdout к имени файла по вашему выбору.
  2. затем tar с опцией-T, которая позволяет ему принимать список местоположений файлов (тот, который вы только что создали с помощью find!)

    find . -name "*.whatever" > yourListOfFiles
    tar -cvf yourfile.tar -T yourListOfFiles
    

попробуй:

    find . -type f | xargs -d "\n" tar -czvf backup.tar.gz 

почему бы и нет:

tar czvf backup.tar.gz *

конечно, это умно, чтобы использовать find, а затем xargs, но вы делаете это трудный путь.

Update: Porges прокомментировал с помощью опции поиска, которая, по моему мнению, является лучшим ответом, чем мой ответ, или другой:find -print0 ... | xargs -0 ....

если у вас есть несколько файлов или каталогов, и вы хотите, чтобы пронестись их в независимая

почему бы не дать что-то вроде этого попробовать: tar cvf scala.tar `find src -name *.scala`

другое решение, как видно здесь:

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

    Ничего не найдено.