在批处理文件中的同一行中运行2个unix命令

时间:2014-01-30 03:49:27

标签: bash csv cygwin

如果我的术语不正确,请提供帮助,请原谅。

我要做的是写一个scrpit / .bat文件,它将执行以下操作:
将1个目录(和子目录)从pointA复制到B点。
然后在pointB(和子目录)中解压缩将提供* .csv文件的文件
然后在pointB(和子目录)中我想从所有这些csv文件中删除一些行

这个在cygwin上运行的unix命令会将/ cygdrive / v / pointA / *中的所有文件复制到当前目录。 (即点是当前的工作目录)

cp /cygdrive/v/pointA/* .

这个在cygwin上运行的unix命令将遍历以.zip结尾的目录和子目录中的所有文件。 并解压缩它们

find -iname *.zip -execdir unzip {} \;

这个在cygwin上运行的unix命令将遍历以.csv结尾的目录和子目录中的所有文件
对于每个文件,它删除前6行和最后一行,这是返回的文件。

find ./ -iname '*.csv' -exec sed -i '1,6d;$ d' '{}' ';'

我希望在一个脚本/ bat文件中执行此操作,但我遇到第一个find命令时遇到问题 我在一行上查找和解压缩命令时遇到问题,我想知道如何以及如何做到这一点

chdir C:\pointA
C:\cygwin\bin\cp.exe /cygdrive/v/pointB/* .
::find -iname *.zip -execdir unzip {} \;
::find ./ -iname '*.csv' -exec sed -i '1,6d;$ d' '{}' ';' 

我确实尝试过这样的事情:

C:\cygwin\bin\find.exe -iname *.zip -execdir C:\cygwin\bin\unzip.exe {} \;  

但我得到以下内容:

/usr/bin/find: missing argument to `-execdir'

有人可以建议是否/如何做到这一点?

1 个答案:

答案 0 :(得分:1)

Cygwin工具使用他们自己的路径,例如/cygdrive/c/cygwin/bin/unzip.exe虽然有时带有反斜杠的Windows路径有效,但反斜杠确实会使Cygwin工具混淆。

我强烈建议您使用Bash shell脚本而不是cmd.exe Windows批处理文件编写工具。根据我的经验(1),在bash脚本中进行流控制比在批处理文件中容易得多,以及(2)Cygwin环境在Bash中运行得更好。您可以打开bash shell并运行bash yourscript.sh

您的Bash脚本可能如下所示:(未经测试)

#!/bin/bash
# This script would be run from a Cygwin Bash shell.
# You can use the Mintty program or run C:\cygwin\bin\bash --login
# to start a bash shell from Windows Command Prompt.

# Configure bash so the script will exit if a command fails.
set -e 

cd /cygdrive/c/pointA
cp /cygdrive/v/pointB/* .

# I did try something like this:

# 1. Make sure you quote wildcards so the shell doesn't expand them
#    before passing them to the 'find' program.
#
# 2. If you start bash with the --login option, the PATH will be
#    configured so that C:\cygwin\bin is in your PATH, and you can
#    just call 'find', 'cp' etc. without specifying full path to it.

# This will unzip all .zip files in all subdirectories under this one.
find -iname '*.zip' -execdir unzip {} \;