Расширение переменной не происходит в одинарных кавычках, вместо этого используйте двойные кавычки.
+, так как ваша переменная будет содержать /
как часть пути. с GNU sed
вы должны использовать другой разделитель замены.
read -p "Enter path name: " PT
sed -i "\#path# s#.*#& $PT#" infile
Предположим, что вы используете оболочку bash
:
shopt -s globstar nullglob dotglob
./avg outAVG./**/*B02_10m.tif
Это вызовет вашу программу avg
со всеми файлами в текущем каталоге или ниже, имена файлов которых заканчиваются на B02_10m.tif
. Это достигается путем включения шаблона подстановки **
с помощью shopt -s globstar
. Этот шаблон "рекурсивно" сопоставляется с подкаталогами. Если ваши файлы TIFF находятся в текущем каталоге , вам не нужен бит **
этого шаблона.
Два других параметра оболочки гарантируют, что шаблоны подстановки соответствуют скрытым именам и что они вообще не расширяются, если совпадения нет, просто чтобы имитировать то, что вы пытаетесь сделать с помощью find
.
Если вы используете оболочку zsh
, вместо этого вы можете использовать
./avg outAVG./**/*B02_10m.tif(.DN)
, который сделал бы то же самое. Опять же, если вы знаете каталог, в котором хранятся изображения TIFF, вам не нужен бит **
шаблона, вместо этого вы можете вставить правильный путь к этому каталогу.
В любойsh
-подобной оболочке, если ваши файлы находятся в каталоге с именем $dir
, вы можете использовать
./avg outAVG "$dir"/*B02_10m.tif
Это, очевидно, не будет выполнять рекурсивный поиск в подкаталогах $dir
.
Ваш подход не работает по двум причинам:
У вас есть синтаксическая ошибка в присвоении переменной files
. Вокруг =
в присваивании не может быть пробелов.
При исправлении этой синтаксической ошибки вы объединяете множество отдельных имен файлов в одну строку. При этом игнорируется тот факт, что имена файлов могут содержать пробелы и символы, обычно используемые в качестве подстановочных знаков оболочки. Когда вы позже используете $files
без кавычек, оболочка разделит строку на несколько слов по пробельным символам (по умолчанию ), а затем расширит все слова, которые выглядят как шаблоны подстановки оболочки. Это приведет к тому, что ваш код будет работать неправильно, если у вас не всегда будут очень простые имена файлов.
Для получения дополнительной информации об этих проблемах см., например,.
find
для чего-либо ), ls
в один из ваших комментариев).