tar - исключить определенные файлы
Я хотел бы tar все файлы в каталоге и его подкаталогах, которые НЕ заканчиваются на.jpg, .bmp, .gif или png.
Итак, предоставлены следующие папки и файлы:
foo/file.txt
foo/file.gif
foo/bar/file
foo/bar/image.jpg
Я хочу, чтобы tar только файлы file.txt и file. file.gif и image.jpg следует игнорировать. Я также хотел бы сохранить структуру папок.
Моей первой мыслью было передать результаты команды find вместе с grep -v ".jpg|.gif|.bmp.png" в текстовый файл, а затем использовать аргумент tar include для передачи ему этого списка файлов.
Однако результаты команды grepped find также содержат каталоги (в приведенном выше примере это были бы "foo" и "foo/bar"), и когда каталог подается в tar, он включает все файлы в этом каталоге, поэтому Я бы закончил с файлом tar, содержащим все файлы - не то, что я хочу.
Есть ли способ предотвратить вывод директорий find? Есть ли гораздо более простой способ приблизиться к этому?
2 ответа
Использование --exclude=pattern
опция:
tar --exclude='*.jpg' --exclude='*.png' --exclude='*.bmp' --exclude='*.gif' -cvf tar-filename.tar folder
Я думаю, что самый элегантный способ удалить несколько типов файлов — это использовать так называемое расширение скобок.
Как происходит расширение брекетов?
Расширение скобок позволяет создавать несколько строк из шаблонов внутри фигурных скобок, где каждый шаблон отделяется запятой. Например, команда
echo Front-{A,B,C}-Back
будет давать
Front-A-Back Front-B-Back Front-C-Back
Вот так просто :) Вы также можете расширить диапазон целых чисел, используя следующую запись:
echo {001..15}
Как с помощью расширения скобок решить вашу проблему?
Попробуй это:
tar --exclude={'*.jpg','*.png','*.bmp','*.gif'} -cvf tar-filename.tar folder
Если вы хотите проверить, что происходит, просто повторите эту последнюю команду, и вы заметите, что она выдает
tar --exclude=*.jpg --exclude=*.png --exclude=*.bmp --exclude=*.gif -cvf tar-filename.tar folder
Оба способа верны, но мой гораздо читабельнее и компактнее :)