我有一个带有2个参数的exe,它们都是csv,如下所示 splitline.exe /dir/file1.csv /dir1/file2.csv,这基本上将输入文件中的行拆分为输出文件中的2行。因此,我编写了一个Shell脚本来执行此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 其给出的输出为“无文件” 请更正我的错误,因为我是Shell脚本的新手
答案 0 :(得分: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的评论修复了脚本。
答案 1 :(得分: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'