Я хотел бы использовать программу командной строки (в частности, geotifcp ), которая принимает file_a.tif и file_a.tfw и выводит file_b.tif. По сути, он объединяет два файла с одинаковыми именами с разными расширениями и создает новый файл. Я хотел бы выяснить, как собрать несколько тысяч таких вещей. Я создал списки всех этих файлов, используя основные команды ls > output
.
Я не обязательно ищу ответ, нацеленный на эту программу, но больше на сценарии в целом.
Я также не ищу, чтобы вы написали это для меня, просто подтолкните меня в общем направлении, пожалуйста.
Спасибо за любую помощь!
Я склонен делать подобные вещи, используя sed или awk для построения командных строк, а затем перенаправлять их в оболочку. В качестве возможного примера, если у вас есть файл только с именами файлов xxxxx_a.tif,
sed -e 's/\(.*\)_.*/geotifcp \1_a.tif \1_a.tfw \1_b.tif/' < list-file.txt
, чтобы увидеть, генерирует ли он команды, которые вы ищете, тогда
sed -e 's/\(.*\)_.*/geotifcp \1_a.tif \1_a.tfw \1_b.tif/' < list-file.txt | sh
запустить их всех.
Строка ввода asdfasdfsadf_a.tif
приводит к geotifcp asdfasdfsadf_a.tif asdfasdfsadf_a.tfw asdfasdfsadf_b.tif
, предполагая, что имена файлов ввода - [filename]_a.tif
и [filename]_a.tiw
и имя выхода [filename]_b.tif
.
Я предлагаю, чтобы Вы взглянули на
sed # to manipulate text output from, for instance, ls
и
xargs # to use some std input to generate (many) new command lines
в сочетании с передачей по каналу вывода одной команды во вход следующего (как от ls до sed к xargs)
К остроумию, скажем, у Вас есть каталог с *tif и *tfw файл. Вы хотите сделать что-то в tif файлы с помощью соответствующего tfw файла. Давайте также примем для каждого tif файла существует tfw файл того же самого имени
# list all those tif files in one long column
ls -1 *.tif
# chop of the end .*tif leaving you with the base name
ls *.tif | sed -s 's/\.tif$//'
# feed the previous into xargs to tag a tif with the info in a tfw and
# create new geo_*.tif file
ls *.tif | sed -s 's/\.tif$//' | xargs -i -t geotifcp -e {}.tfw {}.tif geo_{}.tif
Последняя строка могла бы в значительной степени сделать то, в чем Вы нуждаетесь в одном длинном (трудный читать) командная строка без сценариев.
Для помощи пониманию, можно также сначала создать список файлов, как Вы сделали:
ls *tif> output.list
Затем очистите его с sed, чтобы удостовериться, что это ведет себя хорошо.
sed -s 's/\.tif$//' output.list > clean_output.list
закончите затем используют xargs с опцией-p вместо-t для получения подсказки перед выпуском каждой команды:
cat clean_output.list | xargs -i -p geotifcp -e {}.tfw {}.tif geo_{}.tif
Править: Вариация на первого должна использовать больше sed меньше xargs. Это также немного более 'debuggable'. Это действительно требует, чтобы Вы узнали немного о регулярных выражениях (который определенно стоит усилия).
По существу можно генерировать текст Вашей желаемой команды полностью с sed
sed -s 's/\(.*\)\.tif$/geotifcp -e \1.tfw \1.tif geo_\1.tif/' output.list > process.sh
Я знаю, regex выглядит ужасным, но здесь является грубым объяснением содержания в одинарных кавычках: 's/A/B /' занимает место с B в нашем случае, (что-то) .tif (обратите внимание, что мы должны выйти из скобок), что-то хранится в \1 и привыкает для создания команды geotifcp (который является B).
Вы, вероятно, что использовать аргументы командной строки.
Попробуйте этот сценарий bash:
#!/bin/bash
echo "First argument is $1"
echo "Second argument is $2"
Если имя файла сценария test1.sh
, то у вас будет следующее:
a@u1104:~$ chmod +x test1.sh
a@u1104:~$ ./test1.sh
First argument is
Second argument is
a@u1104:~$ ./test1.sh file1.tif file2.tiw
First argument is file1.tif
Second argument is file2.tiw
Другим компонентом будет цикл по вашему файлу. Вы можете сделать это так:
cat test |while read line; do
echo "${line}"
done
Вместо echo "${line}"
вы можете, например, сделать ./test1.sh ${line}.tif ${line}.tiw