我有一个exe,它有两个参数都是csv,如下面的splitline.exe /dir/file1.csv /dir1/file2.csv,这基本上将输入文件中的行拆分为输出file.So中的2行,我写了一个外壳脚本来执行这个exe。目录是固定的,但文件名可以不同,src目录和目标目录中的文件名应该相同。我在windows environment.It上运行它安装了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其给定输出为"no file“请纠正我的错误,因为我是shell脚本新手
发布于 2019-01-24 23:04:11
这个模板怎么样:
#!/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:我不太了解视窗,所以我尽量不使用其他命令,如basename
,或find
等。至于驱动器名称D:
,请检查。也许它被映射到/mnt/d
或其他什么地方。
注3:我已经修复了基于Charles评论的脚本。
发布于 2019-01-25 00:00:06
我会用一些类似的东西:
#!/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'
对于D:/srcdir/srcdir1/
目录中的每个.csv
文件,这将按顺序执行以下操作:
Handling <file name>...
cSplit.exe
,第一个参数是文件的(相对)路径,第二个参数是位于D:/destdir/destdir1/
中的同名文件的路径,该文件位于D:/srcdir/srcdir1/
目录下的D:/srcdir/srcdir1/old
目录one
中,然后在行尾换行。这些操作使用-a
“和”操作数连接在一起,如果前一个操作失败,则不会对文件执行操作(对于cSplit.exe抛出错误的文件,不会从初始目录中删除和备份,并且其行中将缺少"done“)。
如果没有显示任何输出,您将知道没有找到任何文件。如果这还不够,您可以在find
命令后添加以下内容(需要与命令末尾在同一行上):| tee | grep '.' || echo 'no file'
https://stackoverflow.com/questions/54348524
复制相似问题