Как может Вы untar больше чем один файл за один раз?

df = pd.DataFrame({'countries':['US','UK','Germany','China']})
countries = ['UK','China']

реализовать в:

df[df.countries.isin(countries)]

реализовать не так, как в странах покоя:

df[df.countries.isin([x for x in np.unique(df.countries) if x not in countries])]
67
задан Steve Rowe 24 February 2009 в 22:25
поделиться

1 ответ

Что продолжается здесь?

Первоначально, эти tar команда была предназначена для использования с устройствами магнитной ленты. Так как только имело смысл выполняться tar на одном устройстве за один раз, синтаксис был разработан для принятия одного и только одного устройства. Первый файл или каталог передал, как, предполагалось, был устройством, которое содержало рассматриваемый архив и любые другие файлы или каталоги где содержание архива, который будет включен в операцию. Таким образом для tar извлечение (x опция), первый файл передал, будет архив, и все другие файлы были бы файлами, которые будут извлечены. Таким образом, если бы существует два *.tar файлы (скажите a.tar и b.tar), Ваша команда расширилась бы до:

$ tar xf a.tar b.tar

, Если a.tar не содержит файл, названный b.tar, эти tar, команда нечего делать и выходит бесшумно. Раздражающе, версия Соляриса [1 116] не сообщает ни о каких проблемах или в коде возврата или с подробной опцией (v). Между тем, GNU tar возвраты 2 и сообщения со спамом STDERR даже с подробной опцией прочь:

tar: b.tar: Not found in archive
tar: Exiting with failure status due to previous errors

, Как делают меня untar набор файлов сразу?

Это - слишком последняя перезапись tar для принятия нескольких архивных файлов как вход, но не слишком трудно работать вокруг ограничения.

Для большинства людей, работая tar многократно за несколькими архивами самая целесообразная опция. Передача всего одного имени файла к [1 123] извлечет все заархивированные файлы, как можно было бы ожидать. Один подход должен использовать оболочку for цикл:

$ for f in *.tar; do tar xf "$f"; done

Другой метод должен использовать xargs:

$ ls *.tar | xargs -i tar xf {}

, С другой стороны, можно использовать один из многих альтернатива tar средства чтения файлов . Наконец, действительно преданный программист мог легко записать tar замена, которая работает точно, как желаемый. формат прост, и много языков программирования имеют библиотеки в наличии для чтения tar файлы. Если Вы - программист Perl, например, смотрите на Archive::Tar модуль.

А, предупреждающий

, Вслепую несмолить набор файлов может вызвать неожиданные проблемы. Самое очевидное - то, что конкретное имя файла может быть включено больше чем в один tar файл. С тех пор tar файлы перезаписей по умолчанию, точная версия файла, с которым Вы заканчиваете, будет зависеть от порядка, архивы обрабатываются. Больше беспокойства, можно закончить с поврежденной копией файла при попытке этой "умной" оптимизации:

for f in *.tar; do
  tar xf "$f" &
done
wait

, Если и a.tar и b.tar содержат тот же файл и попытку извлечь его одновременно, результаты непредсказуемы.

А связанной проблемой, особенно при взятии архивов из недоверяемого источника, является возможность tarbomb.

Одно частичное решение состояло бы в том, чтобы автоматически создать новый каталог для извлечения в:

for f in *.tar; do 
  d=`basename "$f" .tar`
  mkdir "$d"
  (cd "$d" && tar xf "../$f")
done

Это не поможет, если файл будет определен в архиве с полным путем (который обычно является знаком злонамеренного намерения). Добавление такой проверки оставляют как осуществление для читателя.

133
ответ дан djoffe 7 November 2019 в 10:37
поделиться
Другие вопросы по тегам:

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