Подтвердить что ты не робот

Поиск файлов и дег их (с пробелами)

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

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

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

4b9b3361

Ответ 1

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

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

Он будет:

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

Также смотрите:

Ответ 2

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

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

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

Ответ 3

Попробуйте запустить:

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

Ответ 4

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

tar czvf backup.tar.gz *

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

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

Ответ 5

Если у вас несколько файлов или каталогов, и вы хотите закрепить их в независимом файле *.gz, вы можете это сделать. Необязательный -type f -atime

find -name "httpd-log*.txt" -type f -mtime +1 -exec tar -vzcf {}.gz {} \;

Это сжимает

httpd-log01.txt
httpd-log02.txt

к

httpd-log01.txt.gz
httpd-log02.txt.gz

Ответ 6

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

Ответ 7

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

find var/log/ -iname "anaconda.*" -exec tar -cvzf file.tar.gz {} +

Ответ 8

Лучшее решение - создать список файлов, а затем архивировать файлы, потому что вы можете использовать другие источники и делать что-то еще со списком.

Например, это позволяет использовать список для расчета размера архивируемых файлов:

#!/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+=$1} 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

Ответ 9

Добавил бы комментарий к @Steve Kehlet post, но нужно 50 повторений (RIP).

Для любого, кто нашел этот пост через многочисленные поиски в Google, я нашел способ не только найти конкретные файлы с заданным временным диапазоном, но также НЕ включать относительные пути ИЛИ пробельные символы, которые могли бы вызвать ошибки при вызове. (СПАСИБО, СКОЛЬКО СТИВ.)

find . -name "*.pdf" -type f -mtime 0 -printf "%f\0" | tar -czvf /dir/zip.tar.gz --null -T -
  1. . относительный каталог

  2. -name "*.pdf" поищите PDF файлы (или файлы любого типа)

  3. Тип -type f для поиска - это файл

  4. -mtime 0 поиск файлов, созданных за последние 24 часа

  5. -printf "%f\0" Обычный -print0 ИЛИ -printf "%f" НЕ работал для меня. Со страницы руководства:

Это цитирование выполняется так же, как и для GNU ls. Это не тот же механизм цитирования, который используется для -ls и -fls. Если вы можете решить, какой формат использовать для вывода команды find, то лучше использовать "\ 0" в качестве терминатора, чем использовать символ новой строки, поскольку имена файлов могут содержать пробелы и символы новой строки.

  1. -czvf создать архив, отфильтровать архив через gzip, подробно обработать список файлов, имя архива

Изменить 2019-08-14: Я хотел бы добавить, что я также мог использовать ту же самую команду в своем комментарии, просто используя сам tar:

tar -czvf /archiveDir/test.tar.gz --newer-mtime=0 --ignore-failed-read *.pdf

Требуется --ignore-failed-read, если на сегодня не было новых PDF файлов.