Папка с пробелом в имени не распознана - PullRequest
0 голосов
/ 10 февраля 2019

Я очень новичок в stackoverflow и в сценариях bash / python.

Мне нужно изменить размер некоторых файлов модели ландшафта данных (300+) в формате .tif, чтобы иметь возможность конвертировать ихв .hgt, и я могу сделать все это с помощью инструмента GDAL, но только для одного файла одновременно.Полагаю, вы уже заметили, где начинается скриптинг: нужно автоматизировать процесс для 300+ файлов!

Итак, я начал немного разбираться в том, как работает bash, и получил следующее:

#!/bin/bash
for filename in "'/home/fenix/1\ Vari\ HDD/MTB/DTM\ Alos/'"*.tif; do
    PATH=/usr/bin/ gdalwarp -of Gtiff -ts 3601 3601 $filename.tif "'/home/fenix/1\ Vari\ HDD/MTB/DTM Alos/temp/'"$filename.tif
done

Я всегда использовал обратную косую черту для перемещения в «разнесенные» имена каталогов или файлов, но, похоже, не работает со сценариями .... Google, найденный с помощью кавычек или двойных кавычек, исправил бы это, но все равно безуспешно

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

ОШИБКА 4: '/ home / fenix / 1: такого файла нет илиdirectory

Почему?!?!

Заранее спасибо и извините за мой английский!

РЕДАКТИРОВАТЬ: Следуя предложениям tripleee golden, я отредактировал скрипт следующим образом:

#!/bin/bash
PATH=/usr/bin/
for filename in "/home/fenix/1 Vari HDD/MTB/DTM Alos/"*.tif; do
    gdalwarp -of Gtiff -ts 3601 3601 "$filename" "/home/fenix/1 Vari HDD/MTB/DTM Alos/temp/${filename##*/}"
done

И работал как шарм!

1 Ответ

0 голосов
/ 10 февраля 2019

Ваши чрезмерные кавычки мешают.

#!/bin/bash
for filename in "/home/fenix/1 Vari HDD/MTB/DTM Alos/"*.tif; do
    PATH=/usr/bin/ gdalwarp -of Gtiff -ts 3601 3601 "$filename" "${filename##*/}"
done

Строка /home/fenix/stuff with spaces может быть выражена как либо

/home/fenix/stuff\ with\ spaces
"/home/fenix/stuff with spaces"
'/home/fenix/stuff with spaces'

Обратная косая черта или кавычка в кавычках приводит к литералуобратная косая черта или кавычка, как часть строки в кавычках.Обратная косая черта или обратная косая черта аналогично создает буквальную обратную косую черту или кавычку.

Одиночные кавычки сильнее;все между ними буквально.Двойные кавычки допускают расширение переменных и обратные косые черты, а также кавычки с обратной косой чертой.

Так что "'/home/fenix/1\ Vari\ HDD/MTB/DTM\ Alos/'" относится к ./'/home/fenix/1\ Vari\ HDD/MTB/DTM\ Alos/, который, вероятно, не является допустимым путем, если текущий каталог не содержит каталог, имя которого буквально является единственнымцитата и т. д. (где я ставлю ведущий ./ только для того, чтобы сделать это более явным).

Возможно, сложность заключается в том, что кавычки запрещают расширение подстановочных знаков;поэтому подстановочный знак *.tif необходимо заключать в кавычки.(Ну, собственно говоря, только кавычки должны быть без кавычек; *'.tif' или *".tif" или *\.\t\i\f тоже будут работать.)

Обратите внимание также, что значение $filename - это полный путьк каждому расширенному значению подстановочного знака, без обрезания префикса каталога или суффикса расширения или любой другой магии, подобной этой.Я умозрительно показал, как передать последний аргумент в качестве имени файла с обрезанным путем к каталогу (подстановка параметра ${variable##pattern} возвращает значение variable с любым префиксом, совпадающим с pattern обрезанным).Таким образом, выходной файл должен попасть в текущий каталог, с inp ^ t из совпадения с подстановочными знаками (надеюсь, тогда в другом каталоге, чтобы не перезаписывать входные файлы).

Наконец, посмотрите, какмы стараемся всегда использовать двойные кавычки вокруг переменных, которые содержат имена файлов.(В противном случае это распространенная ошибка даже в некоторых довольно популярных руководствах. Сценарий будет работать до тех пор, пока вы не попытаетесь обработать имена файлов с нерегулярным интервалом или буквальными звездочками и т. Д.)

Странно PATHназначение тоже выглядит странно.gdalwarp выполняет внешние команды, и вы действительно хотите, чтобы он находил только внешние команды в /usr/bin?Или, возможно, вы хотите запустить /usr/bin/gdalwarp (хотя установка правильного PATH в начале скрипта, возможно, будет лучше, чем жесткое кодирование определенного абсолютного пути).

...