Учитывая базовый каталог (например, /home/user
) есть ли команда, которую можно было бы запустить, чтобы создать архив для всех текстовых файлов (то есть файлов размером менее 100 КБ) в этом каталоге и его дочерних элементах? Я знаю, что вы можете использовать tar / gz для каталога, но как насчет исключения файлов?
Идея состоит в том, что большинство фотографий, видео и других больших файлов будут проигнорированы, в то время как все важные документы, набранные вручную, можно будет легко скопировать быстро при перемещении проектов и серверов.
ОБНОВИТЬ
Используя потрясающий код skinp, я смог сделать резервную копию небольшого количества файлов. Однако, как указал DerfK, существует ограничение на размер аргументов, которые вы можете передавать командам. Имея это в виду, я смог выписать содержимое find
надеясь, что я смогу использовать что-нибудь, чтобы прочитать содержимое tar
и обойти это ограничение. Другой вариант - это сценарий sh, который может добавлять каждый файл в архив за раз.
find /home/username -type f -size -100k > list.of.small.files.txt
В результате получился файл размером 6 МБ.
Глядя на другие ответы, опубликованные здесь, я обеспокоен тем, что использование xargs
и find -exec {}
ошибочны. Если и когда список файлов станет достаточно длинным, tar -c
выполняется xargs
более одного раза заполненный до этого момента tar-файл будет перезаписан. Таким образом, только файлы из последнего вызова tar
попадет в tarfile.
Вот однострочник, который всегда должен работать, независимо от общего количества файлов и независимо от того, содержат ли имена файлов встроенные символы новой строки:
find /home/user -type f -size -100k -print0 | tar -c -z --null --files-from=- -f backup.tgz
В find
команда генерирует список имен файлов с завершающим нулем для резервного копирования, а tar
команда считывает этот список из канала и создает tar-файл backup.tgz
.
Я бы использовал силу поиска:
find /home/user -type f -size -100k -exec tar cvzf backup.tgz {} \+
тип: указывает, что вам нужен файл, а не каталог
size: с числом перед - означает, что мы хотим меньше 100k
exec: выполнить tar с {} найденными файлами, \ + означает конец exec
Вы также можете использовать xargs:
find /home/user -type f -size -100k | xargs tar cvzf backup.tgz
Обновить:
tar в качестве команды для добавления файла в существующий архив tar (возможно, даже не существующий, у меня это работает).
Вот простой пример этого скрипта:
find . -type f -size -100k -print > filelist
for i in `cat filelist`
do
tar --append $i --file=backup.tar
done
gzip backup.tar
Очевидно, этот скрипт крайне неэффективен ... Он добавляет только один файл за раз, запуская команду tar столько раз, сколько файлов.
Было бы хорошо написать сценарий таким образом, чтобы он добавлял, скажем, 1000 файлов за каждый проход ...
Пытаться
find /home/user -type f -size -100k -print0 | xargs -0 tar cvzf tarfile.tar.gz
что будет безопасно и для файлов с пробелами в имени.