Может ли tar -xvf использоваться в операторе If для возврата true или false - PullRequest
2 голосов
/ 28 июля 2011

Я знаю, что может показаться странным, но мне было интересно, смогу ли я сделать if [tar -xvf] для какого-либо файла, и это вернет мне значение true или false.

Мне нужно что-то записать в файл, если tarring был успешным, а если нет, то в тот же файл записывается что-то еще.

что-то вроде

if[ find . -maxdepth 1 -name "*.tar" -exec tar -xvf {} ] ; then
echo " Untar Successful"> test.txt
else
echo "Untar Not Successful"> test.txt

Пожалуйста, дайте мне знать, если я могу что-то сделать для реализации этого

Ответы [ 4 ]

8 голосов
/ 28 июля 2011
EXIT STATUS
     The tar utility exits 0 on success, and >0 if an error occurs.

Вы можете проверить ошибку как

if [ $? -ne 0 ]; then

Где $? самый последний статус выхода из переднего трубопровода.

3 голосов
/ 28 июля 2011

Вы не можете надежно использовать состояние find, чтобы определить, успешно ли выполняются выполняемые им команды.Определение POSIX find гласит:

find

STATUS EXIT

Должны быть возвращены следующие значения выхода:

0 Все операнды пути были успешно пройдены.

>0 Произошла ошибка.

Это отличается от того, чтобы что-либо говорить о состояниях выхода любых выполненных команд.

Утилита xargs предоставляет необходимую информацию.POSIX говорит:

xargs

STATUS EXIT

Должны быть возвращены следующие значения выхода:

0 Все вызовы утилиты вернули выходстатус ноль.

1-125 Не удалось собрать командную строку, отвечающую указанным требованиям, один или несколько вызовов утилиты вернули ненулевой статус завершения или произошла какая-то другая ошибка.

126 Утилита, указанная утилитой, найдена, но не может быть вызвана.

127 Утилита, указанная утилитой, не найдена.

Итак, вы можетеuse:

if find . -maxdepth 1 -name "*.tar" -print0 | xargs -0-L 1 tar -xf
then echo "Untar Successful"
else echo "Untar Not Successful"
fi > test.txt

Обратите внимание, что при этом используется только одно перенаправление.Он проверяет состояние выхода конвейера, то есть состояние выхода последней команды в конвейере, то есть состояние выхода xargs, которое сообщает вам, работало ли оно или нет.

* 1054Опции * и -0 являются расширениями GNU для стандарта POSIX.Пока ваши имена файлов не содержат пробелов, символов новой строки или табуляции, вы можете спокойно использовать -print (и не иметь соответствующего аргумента для xargs).

1 голос
/ 28 июля 2011

Вы можете сделать:

find ... -exec sh -c 'tar ... && echo success || echo failure'

или

find ... -exec sh -c 'if tar ...; then echo success; else echo failure; fi'

(Это выдает сообщение для каждого файла, и вы можете указать путь к tar файл, поставив {} в отраженном сообщении. Если вы хотите сделать один отчет на в конце говорится, что все гудки были успешными, вы можете сделать что-то вроде:

if find ... -exec sh -c 'tar ... && echo success || echo failure' |
  grep failure > /dev/null; then
    echo "untar failed"
else
    echo "untar successful"
fi

но мне это кажется менее полезным.

0 голосов
/ 07 марта 2013

Вы можете определенно сделать «tar -tf» для файлов tar. Варианты могут очень в соответствии с расширениями, которые у вас есть. Вы также можете добавить опции "v" для подробного описания.

tar -Jtf "ABC.tar.xz"
tar -jtf "ABC.tar.bzip2"
tar -tf "ABC.tar"

Вы даже можете найти список файлов.

tar -tf "ABC.tar" "./ABC/hello.c" >/dev/null 2>&1

Если в файле zip присутствует файл hello.c, он вернет success (0), иначе вернет код ошибки.

...