Как запустить EXE с помощью сценария оболочки
У меня есть exe, который принимает 2 параметра, оба являются CSV, как показано ниже splitline.exe /dir/file1.csv /dir1/file2.csv, это в основном разделяет строки во входном файле на 2 строки в выходном файле. Итак, я написал сценарий оболочки для выполнения этого EXE-файла. каталог фиксированный, но имя файла может отличаться, имя файла в каталоге src и каталоге назначения должно быть одинаковым. Я запускаю его в среде Windows. На нем установлен MKS, поэтому также можно выполнить сценарии unix и shell. Ниже приведен фрагмент кода, который я написал:
#!/bin/sh
srcdir='D:/srcdir/srcdir1/'
destdir='D:/destdir/destdir1/'
extension='csv'
srcfile='${srcdir}/*.csv'
if [[-f ${srcfile} in ${srcdir}]]
then
cSplit.exe "${srcdir}/{srcfile}.${extension}" "${destdir}/${srcfile}.${extension}"
mv "${srcfile}" "${srcdir}/old"
else
echo "no file"
fi
вывод: [[-f: splitty.sh 21 не найден. Выводится как "нет файла". Пожалуйста, исправьте мою ошибку, так как я новичок в сценарии оболочки
2 ответа
Как насчет этого шаблона:
#!/bin/bash
src="D:/srcdir/srcdir1" # no '/' at the end of dirname
dst="D:/destdir/destdir1"
cd "$src" || exit # do nothing if $src is not a directory
for f in *.csv; do
if [[ "$f" = '*.csv' ]]; then
echo "no files"
break
fi
if [[ -f "$f" ]]; then
echo cSplit.exe "$f" "$dst/$f" # use 'echo' for testing
echo mv "$f" "$src/old/." # aka dry run
fi
done
Примечание 1: если вы используете Windows, то с помощью /
в порядке bash
; но команда cSplit.exe
может не принять /
в качестве разделителя каталогов. Я не использую Windows, поэтому я не могу это проверить.
Примечание 2: я действительно не знаю Windows, поэтому я пытался НЕ использовать другие команды, такие как basename
, или же find
и т. д. Что касается названия диска D:
пожалуйста, проверьте. Может быть, это сопоставлено с /mnt/d
или что-то.
Примечание 3: я исправил сценарий на основе комментариев Чарльза.
Я хотел бы использовать что-то вроде этого:
#!/bin/bash
cd 'D:/srcdir/srcdir1/'
find . -maxdepth 1 -name '*.csv' \
-printf 'Handling %f...' \
-a -exec cSplit.exe {} 'D:/destdir/destdir1/{}' \; \
-a -exec mv {} ./old/ \; \
-a -printf 'done\n'
Для каждого .csv
файл в D:/srcdir/srcdir1/
В каталоге с этим будут выполнены следующие действия по порядку:
- Начать писать
Handling <file name>...
на линии - казнить
cSplit.exe
с первым аргументом, являющимся (относительным) путем к файлу, а вторым путем к файлу с тем же именем, расположенным вD:/destdir/destdir1/
каталог - Переместить файл из
D:/srcdir/srcdir1/
каталог кD:/srcdir/srcdir1/old
каталог - Написать
one
с последующим переводом строки в конец строки.
Действия объединяются с -a
Операнды "И" и не будут приняты для файла, если предыдущее действие не удалось (файл, для которого cSplit.exe выдал ошибку, не будет удален из исходного каталога и резервной копии, а "готово" будет отсутствовать с его линии).
Вы будете знать, что файлы не были найдены, если не отображаются выходные данные. Если вам этого недостаточно, вы можете добавить следующее после find
команда (должна находиться в той же строке, что и конец команды): | tee | grep '.' || echo 'no file'