Поиск файлов и дег их (с пробелами)
Хорошо, такая простая проблема здесь. Я работаю над простым резервным кодом. Он отлично работает, если в файлах нет пробелов. Вот как я нахожу файлы и добавляю их в архив tar:
find . -type f | xargs tar -czvf backup.tar.gz
Проблема заключается в том, что файл имеет пробел в имени, потому что tar считает, что это папка. В принципе, есть ли способ добавить цитаты вокруг результатов поиска? Или другой способ исправить это?
Ответы
Ответ 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 -
.
относительный каталог
-name "*.pdf"
поищите PDF файлы (или файлы любого типа)
Тип -type f
для поиска - это файл
-mtime 0
поиск файлов, созданных за последние 24 часа
-printf "%f\0"
Обычный -print0
ИЛИ -printf "%f"
НЕ работал для меня. Со страницы руководства:
Это цитирование выполняется так же, как и для GNU ls. Это не тот же механизм цитирования, который используется для -ls и -fls. Если вы можете решить, какой формат использовать для вывода команды find, то лучше использовать "\ 0" в качестве терминатора, чем использовать символ новой строки, поскольку имена файлов могут содержать пробелы и символы новой строки.
-czvf
создать архив, отфильтровать архив через gzip, подробно обработать список файлов, имя архива
Изменить 2019-08-14:
Я хотел бы добавить, что я также мог использовать ту же самую команду в своем комментарии, просто используя сам tar:
tar -czvf /archiveDir/test.tar.gz --newer-mtime=0 --ignore-failed-read *.pdf
Требуется --ignore-failed-read
, если на сегодня не было новых PDF файлов.