Хорошо, здесь такая простая проблема. Я работаю над простым резервным кодом. Он отлично работает, за исключением случаев, когда в файлах есть пробелы. Вот как я нахожу файлы и добавляю их в tar-архив:
find . -type f | xargs tar -czvf backup.tar.gz
Проблема в том, что в имени файла есть пробел, потому что tar думает, что это папка. В принципе, есть ли способ добавить кавычки к результатам поиска? Или другим способом исправить это?
find ... | xargs ...
заключается в использовании -print0 / -0 параметра на каждом:find -print0 ... | xargs -0 ...
. Это приведет к тому, что имена файлов будут разделены нулевым символом, что означает, что в ваших именах файлов могут быть пробелы, новые строки или другие странные вещи, и это все равно будет работать.Ответы:
Использовать это:
Так и будет:
tar -c
with,xargs
будет делать, когда у вас большое количество файловТакже см:
источник
-print0
применяется только к последнему выражению. Напримерfind . \( -type f -o -name '*.c' \) -print0 | ...
c:\cygwin\bin\find . -regextype posix-egrep -regex '.*(sln^|vcxproj^|filters)$' -print0 | c:\cygwin\bin\tar -cvf MS_Projects.tar --null -T -
-T
, и он означает чтение имен файлов из стандартного ввода: если вы укажете одно тире в качестве имени файла для `--files-from '(то есть вы укажете либо --files-from = - или -T -), то имена файлов считываются из стандартного вводаМожет быть другой способ добиться желаемого. В принципе,
Затем tar с параметром -T, который позволяет ему получать список местоположений файлов (тот, который вы только что создали с помощью find!)
источник
Попробуйте запустить:
источник
Почему нет:
Конечно, было бы разумно использовать find, а затем xargs, но вы делаете это трудным путем.
Обновление: Поргес прокомментировал вариант поиска, который, на мой взгляд, является лучшим ответом, чем мой ответ или другой:
find -print0 ... | xargs -0 ....
источник
xargs ... tar c ...
перезапишет первый созданный архив, если список файлов слишком длинный, иxargs
выполнитсяtar
во второй раз! Чтобы избежать перезаписи, вы можете использовать,xargs -x
но тогда архив может быть неполным. Альтернативой может быть сначала,tar c ...
а затем, возможно, несколько разtar r ...
. (мой вклад в надежность :)Если у вас есть несколько файлов или каталогов, и вы хотите заархивировать их в независимый
*.gz
файл, вы можете это сделать. По желанию-type f -atime
Это сожмёт
к
источник
Почему бы не попробовать что-то вроде этого:
tar cvf scala.tar `find src -name *.scala`
источник
Другое решение, как здесь :
источник
Хотел бы добавить комментарий к сообщению @Steve Kehlet, но потребуется 50 повторений (RIP).
Для всех, кто нашел этот пост через многочисленные поисковые запросы, я нашел способ не только найти определенные файлы с заданным временным диапазоном, но и НЕ включать относительные пути ИЛИ пробелы, которые могут вызвать ошибки tarring. (БОЛЬШОЕ СПАСИБО СТИВ.)
.
относительный каталог-name "*.pdf"
ищите PDF-файлы (или файлы любого типа)-type f
тип для поиска - это файл-mtime 0
искать файлы, созданные за последние 24 часа-printf "%f\0"
Обычное-print0
ИЛИ-printf "%f"
у меня НЕ сработало. Со страниц руководства:-czvf
создать архив, отфильтровать архив через gzip, подробно перечислить обработанные файлы, имя архиваИзменить 2019-08-14: я хотел бы добавить, что я также мог использовать ту же команду в своем комментарии, просто используя сам tar:
Требуется
--ignore-failed-read
на случай, если на сегодня не будет новых PDF-файлов.источник
Лучшее решение - создать список файлов и затем архивировать файлы, потому что вы можете использовать другие источники и делать что-то еще со списком.
Например, это позволяет использовать список для расчета размера архивируемых файлов:
источник