Извлекайте tar в каталог, удаляя все файлы, которые он содержит, НЕ присутствующие в архиве

Пожалуйста, откройте:

/etc/yum/pluginconf.d/fastestmirror.conf

... и измените 1 на 0 во включенном параметре.

Затем:

yum clean all

Кроме того, вместо того, чтобы навсегда отключить плагин fastestmirror, вы можете добавить сломанное зеркало в строку исключения в:

/etc/yum/pluginconf.d/fastestmirror.conf

Это все, что вы можете сделать, когда получаете ошибки от зеркал, которые сильно устарели. .

0
19.09.2018, 07:13
2 ответа

Стандартная команда tarпозволяет просмотреть содержимое архива. Краткая форма для этого tar -tf archive.tar.

Используя это вместе с find, grepи подстановкой команд, вы получаете следующее:

rm -f $(find. -d | head -n -1 | grep -Fv "$(tar -tf archive.tar)")

Запустите это в каталоге, в котором вы хотите разместить содержимое архива, и замените archive.tarпутем к файлу архива.

Работа справа налево для конвейера внутри самой внешней подстановки команд:

  • find. -d:Выводит список всех файлов и каталогов в текущем каталоге, перечисляя их подробно -в первом порядке. Первый порядок глубины -важен здесь, так как мы планируем использовать этот список файлов для удаления и, следовательно, должны удалить содержимое каталога перед удалением самих каталогов.
  • head -n -1:Исключить последнюю строку из команды find. Это удалит запись для самого /path, которая может присутствовать или отсутствовать в архиве. Если бы мы не делали вещи в глубине -первого порядка, это было бы tail -n -1.
  • grep -Fv "$(tar -tf archive.tar)":Передайте список архива команде grep, которая затем отфильтрует эти строки из списка, возвращенного find, так что только файлы, которых нет в архиве, будут переданы во внешний rmкоманда.

Пара замечаний:

  • Возможно, это не совсем POSIX-совместимость. Однако он должен работать в GNU bash.
  • Это зависит от того, как tar сообщает о содержимом архива и как архив был создан. В частности, листинг должен соответствовать тому, как findсообщает о вещах. С GNU tar и большинством архивов это должно работать. Если это не для вашего случая, вы, вероятно, можете заставить его работать, используя sedили awkна выходе команды tar внутри самой внутренней подстановки команд.
  • Убедитесь и протестируйте это, прежде чем использовать его на производственных данных, если это не работает по одной из двух вышеуказанных причин,он может удалить все из каталога, в котором вы его запускаете.
4
28.01.2020, 02:31

Трюк grep -vу меня не сработал, так как архив был довольно большим, а команда вылетела с Слишком длинным списком аргументов . Итак, вот подход, который я использовал для удаления накопленного хлама установки MediaWiki:

$ tar -tzf mediawiki-1.35.0.tar.gz | cut -d/ -f2- > foo
$ find /var/www/mediawiki/ | cut -d/ -f5- | while read f;
     do grep -qw "^${f}$" foo || echo "not in archive: ${f}"; done

Нужно немного поэкспериментировать с аргументом -fдля cut, чтобы понять его правильно, и команда здесь ничего не удаляет , она просто распечатает то, что не включены в наш архив.

0
05.04.2021, 19:16

Теги

Похожие вопросы