Intereting Posts
Как удалить автоблокировку LUKS? код выхода команды ** перед ** последним? Изменение моего каталога по умолчанию в passwd меняет мое приглашение установить ограничение скорости передачи пакетов через iptables Yum всегда перечисляет некоторые пакеты Преобразование ext4 в btrfs: Если я случайно потеряю питание системы во время преобразования, я потеряю данные? Общие сведения о исполняемых форматах Linux и пакетах распространения программного обеспечения Сценарий удаленного резервного копирования SSH Zfs Replace – Как удалить диски после замены Как избежать сокращения имен устройств до 16 символов в / dev / disk / by-label? Проблемы с загрузкой Debian на ноутбуке Dell Несколько версий Java на одном ПК Почему цитирование исполняемого файла постоянно меняет название PuTTY? Ubuntu 16.04 PCi Passthrough QEMU / KVM проблемы доступ к системе / dev / xx был изменен при перезапуске systemd

Как проверить, содержит ли каталог те же файлы в архиве TAR?

Предположим, у меня есть папка Documents и файл TAR Documents.tar , как проверить, содержит ли файл tar файлы, которые находятся в каталоге?

Более очевидным решением для меня было бы сделать:

 $ tar xvf Documents.tar -C untarDocs $ diff -r Documents untarDocs 

К сожалению, это очень медленно для больших файлов TAR, есть ли другая альтернатива?

Использование tar -dvf Documents.tar (или –diff, –compare) не работает, потому что оно не обнаруживает файл, который присутствует в файловой системе, но не в файле TAR, он просто обнаруживает файл, присутствующий в TAR, но не в файловой системе, например:

 $ mkdir new $ touch new/foo{1..4} $ tar cvf new.tar new/ $ touch new/bar $ tar --diff --verbose --file=new.tar #### doesn't detect new/bar ######### $ rm new/foo1 $ tar --diff --verbose --file=new.tar 

Вывод

 new/ new/foo2 new/foo3 new/foo4 new/foo1 tar: new/foo1: Warning: Cannot stat: No such file or directory ### works ### 

Если вы хотите сравнить только списки имен файлов и каталогов, опция -d не поможет. Вместо этого, разборчивые списки из find и tar -tf будут делать это .

Начиная с имен, принятых в оригинальном примере OP:

 $ tar xvf Documents.tar -C untarDocs $ diff -r Documents untarDocs 

здесь предлагается сценарий для разграничения имен файлов:

 #!/bin/sh MYDIR=$(mktemp -d) tar tf Documents.tar |sort >$MYDIR/from-tar find Documents |sort >$MYDIR/from-dir (cd $MYDIR && diff -r from-tar from-dir) rm -rf $MYDIR 

Это предполагает, что Documents.tar содержит один и тот же каталог «Документы» верхнего уровня. Если это нехорошее предположение, то списки должны быть отфильтрованы, чтобы удалить имя каталога верхнего уровня. ОП не указывает, что это будет проблемой.

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

Я использовал mktemp из-за того, что OP использует GNU tar (параметр -d ), что делает его вероятным для Linux.

Разумеется, нет никакой POSIX tar для справки относительно -d . pax также не выполняет diff.

Со стандартным tar-архивом это невозможно. Это связано с тем, что стандартный tar-архив не содержит список содержимого каталога.

С помощью star улучшений, которые присутствуют, когда звездам предлагается архивировать все, что необходимо для инкрементных резервных копий, оно работает:

1) star -c -dump -C somedir . > /tmp/tarfile star -c -dump -C somedir . > /tmp/tarfile

2) star -diff -vv -C comparedir < /tmp/tarfile

Вы можете уменьшить количество метаданных, которые сравниваются с помощью параметра diffopts= , см. diffopts= страницу.