0

我有一个 exe,它带有 2 个参数,都是 csv,如下所示 splitline.exe /dir/file1.csv /dir1/file2.csv,这基本上将输入文件中的行拆分为输出文件中的 2 行。所以,我写了执行此 exe 的 shell 脚本。目录是固定的,但文件名可以不同,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 not found 它的输出为“无文件” 请纠正我的错误,因为我是 shell 脚本的新手

4

2 回答 2

1

这个模板怎么样:

#!/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:我已经根据 Charles 的评论修复了脚本。

于 2019-01-24T15:04:10.667 回答
0

我会使用这些方面的东西:

#!/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“AND”操作数连接,如果前一个操作失败,则不会对文件执行操作(cSplit.exe 引发错误的文件不会从初始目录中删除和备份,并且“完成”将在其行中丢失)。

如果没有显示输出,您将知道没有找到文件。如果这对您来说还不够,您可以在find命令之后添加以下内容(需要与命令末尾位于同一行):| tee | grep '.' || echo 'no file'

于 2019-01-24T16:00:05.693 回答