Проблема - Вы, используют относительные пути, но Вы изменяете каталоги посреди сценария. Если Вы мысленно прослеживаете через шаги:
# command # relevant absolute path(s)
./script.sh ./bla/bla/bla/ # PWD/script.sh
mkdir -p ./bla/bla/bla/ # PWD/bla/bla/bla/
cd ./release/ # PWD/release
cp -rf ./html/ ./bla/bla/bla/ # PWD/release/html PWD/release/bla/bla/bla
Заметьте, как Вы создали PWD/bla/bla/bla/
но пытаются скопировать в PWD/release/bla/bla/bla/
. Необходимо удостовериться mkdir
и cp
происходите в том же каталоге.
Вот предложенная альтернатива. Я заменил все run ()
функция с опциями оболочки xtrace
(-x
), который отображает каждую команду, прежде чем она будет выполнена, и errexit
(-e
), который выходит, если какая-либо команда возвращает ошибку.
#!/bin/bash -xe
cd ./release/
if [ ! -d "$1" ]; then
mkdir -p "$1"
fi
cp -rf ./html "$1"
Это не сохраняет порядок строк, но это не было требованием
awk '{line[$1]=$0} END {for (key in line) print line[key]}' file1 file2
$ awk -F, 'NR==FNR{a[$1]=$0;next};$1 in a {$0=a[$1]}; 1' file2 file1
{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"18"}
{"name":"golf3", "value":"8"}
Это принимает это file2
только записи обновлений, которые уже найдены в file1
. Если file2
может вставить новые записи, можно хотеть изменить его на:
awk -F, '
NR==FNR{a[$1]=$0;next}
$1 in a {$0=a[$1];delete a[$1]}
1
END{for (i in a) print a[i]}' file2 file1
Порядок, в котором отображены вставленные записи, является неуказанным. Вышеупомянутое предполагает, что существует только одна запись на имя в каждом файле.
Если порядок не важен, эти команды должны сделать это:
cat file2 file1 > files
cut -f2 -d: files | cut -f1 -d, | sort | uniq > pat
for i in $(cat pat); do grep $i files -m 1; done
Первая команда присоединяется к входным файлам (порядок важен; file2 идет сначала, потому что его значения переопределят тех в file1).
Вторая команда сокращает автомобильные бренды из входных файлов, видов и удаляет дубликаты и хранит их в pat
файл.
Третья команда захватывает каждый шаблон на объединенном входном файле и остановки на первом соответствии, поэтому если тот же автомобильный бренд появляется на обоих файлах, только тот в file2 печатается.
Если порядок важен, и все шаблоны находятся в file1, можно использовать просто file1 во второй команде (вместо файлов) и опустить sort
и uniq
команды.
...sort | uniq | while read i ; do...
. Кроме того, можно передать вывод по каналу cat
кому: cut
: cat file2 file1 | cut -f2 -d: | ...
.
–
22.07.2013, 16:32