Фильтровать дубликаты имен файлов с помощью tar

Я использую tar как это,

tar -cjpvf a.tar "$pattern1" "$pattern2" 

Проблема в том, что pattern1 и pattern2 иногда совпадают с одним и тем же файлом, но tar, похоже, не фильтрует эти дубликаты.

Например, следующий пример добавляет две дубликаты записи в архив

 %> tar -cjpvf a.tar /etc/passwd /etc/passwd %> tar -xvf a.tar etc/passwd etc/passwd и %> tar -cjpvf a.tar /etc/passwd /etc/passwd %> tar -xvf a.tar etc/passwd etc/passwd 

Как я могу отфильтровать их?

  • zsh: исключение файлов из шаблона
  • Есть ли замена «ls», которая может обрабатывать подстановочные знаки?
  • Использовать все хосты, завершенные zsh для cssh
  • Как удалить 2 месяца назад файлы в unix
  • Где scp помещал эти файлы?
  • Способ записи нового имени файла на подстановочный знак?
  • скопировать все файлы, не имеющие расширения
  • Удалите несколько последовательных имен файлов, но игнорируйте часть первого
  • 3 Solutions collect form web for “Фильтровать дубликаты имен файлов с помощью tar”

    Если pattern2 и pattern2 являются шаблонами шаблонов оболочки, вы можете использовать or-pattern.

     tar -cjpvf a.tar @($pattern1|$pattern2) 

    Для этого требуется ksh, bash или zsh. В bash вам нужно shopt -s extglob запустить shopt -s extglob чтобы активировать синтаксис шаблона @(…) . В zsh вам нужно setopt ksh_glob запустить setopt ksh_glob (а также указать zsh, что переменные содержат шаблоны, а не строки, поэтому @($~pattern1|$~pattern2) ) или использовать собственный синтаксис ($~pattern1|$~pattern2) .

    Если вам удобно разбирать вывод ls (и здесь, предполагая, что ни одно из имен файлов не содержит символов $IFS или подстановочных знаков или начинается с - ):

     tar -cjpvf a.tar $(ls -d1 <pattern1> <pattern2> | sort | uniq) 

    или

     tar -cjpvf a.tar $(ls -d1 <pattern1> <pattern2> | sort -u) 

    Если вам неудобно разбирать вывод ls , правильным подходом является использование find (здесь предполагается GNU tar или совместимый):

     find -maxdepth 1 \( -name <pattern1> -o -name <pattern2> \) -print0 \ | xargs -0 tar -cjpvf a.tar 

    (здесь предполагается, что список файлов достаточно мал, чтобы запустить только один вызов tar . Также обратите внимание, что find не пропускает скрытые файлы по умолчанию).

    Если порядок имеет значение. Например, если вы хотите архивировать файлы foo* и *.txt , и вы хотите, чтобы foo* файлы отображались сначала в архиве (но foo.txt не включался дважды). IOW, получите foo.a foo.b foo.txt foo.z a.txt b.txt z.txt в следующем порядке:

    С zsh :

     files=(./foo*(N) ./*.txt(N)) (($#files)) && tar jcf file.tar.bz2 ${(u)files} 

    С tcsh :

     set -f files = (./foo* ./*.txt) && tar jcf file.tar.gz2 $files:q 

    Если вы хотите убедиться, что *.txt являются последними ( foo.a foo.b foo.z a.txt b.txt foo.txt z.txt в этом порядке):

    С zsh :

     files=(./foo*(N) ./*.txt(N)) (($#files)) && tar jcf file.tar.bz2 ${(uOa)${(Oa)files}} 

    ( Oa – флаг расширения параметра, который меняет порядок массива)

    С tcsh :

     set -l files = (./foo* ./*.txt) && tar jcf file.tar.gz2 $files:q 
    Interesting Posts

    Прямой кеш записи / записи Linux USB Flash

    Как сделать переменную из подоболочки доступной в родительской оболочке

    Какие типы файлов могут иметь общую библиотечную зависимость?

    Bash, если условия переменных в пределах интервалов

    Получите список из 10 наиболее популярных процессов памяти с графом, используя Cacti в Centos 6.3

    autount sshfs с autofs и sshpass

    Mac: самый простой способ перемещения нескольких дубликатов имен файлов в один каталог

    Какой подходящий Debian iso для рабочего стола?

    Вызов java из Bash: «Невозможно выполнить двоичный файл»

    Смягчение замешательства при работе с подобными средами на нескольких серверах

    как узнать, где находится файл конфигурации для apt?

    зачем набирать Ctrl + c, чтобы остановить запуск Linux в Linux?

    Почему вход в канал хорошо подходит для zenity, но <файловые неполадки?

    Шифрование домашнего раздела

    Не удалось запустить .py-файл в cgi-bin с помощью ajax-вызова из моего .php-файла

    Linux и Unix - лучшая ОС в мире.