2016-12-10 3 views
0

У меня есть куча кода, который относительно новый, т.е. множество ошибок скрывается, и у меня есть код как таковой:
if [ -d $DATA_ROOT/$name ], я провел исследование и понял, что это означает, что если каталог существует, но теперь я пытаясь распечатать те справочники, которые существуют, чтобы исправить проблему. Пробовал с помощьюПоказать, где существует каталог

echo `First: $DATA_ROOT` 
    echo `Second: $name` 
    echo `Last: $DATA_ROOT/$name` 
    exit 1; 

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

num_files=`find $DATA_ROOT/$name -name '*' | wc -l` 
if [ ! $num_files -eq $extract_file ] ; then 
    echo "Data extraction failed! Extracted $num_files instead of $extract_file" 
    exit 1; 

Я просто хочу извлечь все файлы правильно, как это сделать, пожалуйста?

+0

Рассмотрите возможность запуска кода через http://shellcheck.net/ и исправление того, что он находит, прежде чем задавать вопросы здесь. –

+0

BTW, '-name '*'' ничего не делает - вы можете оставить это и иметь тот же эффект. –

+0

Вы бы рекомендовали любой онлайн-ресурс, который я мог бы использовать, чтобы поправиться? @CharlesDuffy – Olli

ответ

2

Спинка-пинг вы используете средства «выполнить это как команду»

echo `First: $DATA_ROOT` 
echo `Second: $name` 
echo `Last: $DATA_ROOT/$name` 

попытается выполнить команду под названием «Первый:», который не существует.

Вместо этого используйте двойные кавычки, поскольку они позволяют подстановки переменной, как это и не пытается выполнить его как команду

echo "First: $DATA_ROOT" 
echo "Second: $name" 
echo "Last: $DATA_ROOT/$name" 

Также

find $DATA_ROOT/$name -name '*' 

, вероятно, не то, что вы хотите, то -name '*' по умолчанию, поэтому вам это не нужно. Как указывают другие, find вернет все, включая каталоги и специальные файлы, если у вас есть какие-либо из них. find "$DATA_ROOT/$name" -type f - это то, что вы хотите, если хотите только перечислить файлы или find "$DATA_ROOT/$name" -type d, если вы хотите только перечислить каталоги. Также всегда используйте двойные кавычки вокруг вашего "$DATA_ROOT/$name", поскольку он позволяет обрабатывать имена файлов с пробелами - если у вас есть $name, который содержит пробел, в противном случае вы потерпите неудачу.

0

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

echo "First: $DATA_ROOT" 
echo "Second: $name" 
echo "Last: $DATA_ROOT/$name" 

Вы можете использовать найти команду, чтобы вывести список всех каталогов, таких как:

find $DATA_ROOT/$name -type d 

Выше команды будут перечислены все каталоги (с -type d опцией и используйте -type f, чтобы перечислить все файлы) в пределах $DATA_ROOT/$name, а затем вы можете выполнять операции над этими каталогами.

+1

Одиночные кавычки не будут расширять переменные; это должны быть двойные кавычки. Кроме того, вам нужны двойные кавычки в вашей команде 'find', или это будет ошибкой, если в каталогах в' DATA_ROOT' или 'name' содержатся пробелы. Рассмотрите возможность запуска кода в своем ответе через http://shellcheck.net/ –

0

find содержит не только обычные файлы, но и каталоги (включая .).

Использование find "$DATA_ROOT/$name" -type f.

Смежные вопросы