1

Например:

7za e -y $file_name -o$dest_directory

Это прекрасно работает, когда запускается прямо из командной строки, но в скрипте выдает эту ошибку:

не удалось найти архив (нет архива с таким именем).

Я пытался с помощью:

7za e -y `ls -a | grep 001` -o`pwd` 

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

1 ответ1

2

Я копирую + вставляю ваш скрипт из комментария выше с добавлением разрывов строк в ; признаки читабельности:

!/bin/bash
printf "%s\n" "Please enter full path to the vmfile location e.g. /path/to - "
read
vmfile_path=$REPLY
cd $vmfile_path
7za e -y ls -a | grep 001 -o`pwd`
  • Для начала первая строка должна быть #!/bin/bash если что-нибудь, но я думаю, что это опечатка.

  • Ваша команда read и последующая строка написаны легче, чем просто read vmfile_path . Таким образом, шебанг также может быть изменен на #!/bin/sh так как вы не будете использовать какие-либо специальные функции Bash.

  • Вы должны заключать в кавычки аргумент cd для обработки имен каталогов с пробелами.

  • Я предполагаю, что вы хотите извлечь файл, имя которого содержит строку 001 в последней строке. Прямо сейчас не хватает подмены процесса, и ваше намерение, вероятно, ближе к:

    7za e -y $(ls -a | grep 001) -o$(pwd)
    

    Синтаксис $() легче читать (и имеет некоторые другие преимущества) по сравнению с обратными метками, но он делает то же самое.

    Я также предположил бы, что выходной каталог по умолчанию выводится pwd , что делает его излишним, но я точно не знаю.

  • Ваша команда не понравится, если существует более одного имени файла, соответствующего 001 .

Игнорируя последнюю проблему, вы бы хотели всего что-то вроде:

#!/bin/sh
printf '%s\n' "Please enter full path to the vmfile location e.g. /path/to - "
read vmfile_path
cd "$vmfile_path"
7za e -y "$(ls -a | grep 001)" -o"$(pwd)"

Или, проще, замените последние две строки (также будет обрабатывать несколько совпадений) (хотя это не проверено):

find "$vmfile_path" -maxdepth 1 -name '*001*' -exec 7za e -y -o"$vmfile_path" {} \;

Шаблон соответствия имени, вероятно, можно улучшить, если вы знаете больше имени файла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .