2014-01-30 3 views
0

Оцените любую помощь и извините, если моя терминология неверна.работает 2 команды unix в одной строке в пакетном файле

То, что я пытаюсь сделать, это написать scrpit/bat-файл, который будет делать следующее:
копии 1 каталог (и подкаталоги) из точки А, в точку Б.
Тогда в pointB (и подкаталогах) разархивировать файлы, которые дадут * .csv файлы
Затем в pointB (и подкаталоги) Я хочу удалить некоторые строки из всех этих файлов CSV

Эта команда Unix, работать на Cygwin, будет копировать все файлы из/cygdrive/v/pointA/* в текущий каталог. (Т.е. точка является текущий рабочий каталог)

cp /cygdrive/v/pointA/* . 

Эта команда Unix, работать на Cygwin, будет проходить через все файлы в каталоге и подкаталогах, которые заканчиваются .zip и разархивировать их

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

Эта команда unix, запущенная на cygwin, будет проходить через все файлы в каталоге и подкаталогах, которые заканчиваются на .csv
Для каждого файла он удаляет 1-й 6 строк и последнюю строку, а это возвращаемый файл.

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

Я искал, чтобы сделать это в один файл сценария/летучей мыши, но у меня возникли проблемы с первой командой находят у меня возникли проблемы с находкой и распакуйте команды на одной линии, и мне интересно, как и в случае это может быть сделано

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

Инструменты Cygwin используют свои собственные пути, например. /cygdrive/c/cygwin/bin/unzip.exe, хотя иногда пути Windows с обратными косыми чертами работают, обратные косые черты, как правило, путают инструменты Cygwin.

Я настоятельно рекомендую вам написать свой инструмент в скрипте оболочки Bash вместо командного файла cmd.exe Windows. По моему опыту (1) гораздо проще выполнять управление потоком в сценариях bash, чем в пакетных файлах, и (2) среда Cygwin работает лучше от Bash. Вы можете открыть оболочку bash и запустить 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 {} \; 
+0

ТКС. Я был бы новичком в оболочке bash, поэтому я изучу эту опцию (но конкретные рекомендации приветствуются), но я действительно интересовался/надеялся на это, используя команды, которые у меня уже есть, но моя неопытность, вероятно, показывается. – HattrickNZ

+0

Эти * * команды, которые у вас уже есть. – tripleee

+0

Yup, вы можете начать с простого сценария bash одной строки и добавить к нему, пока он не станет самой мощной программой. Обычно, как только сценарий оболочки будет иметь 4 экрана или больше по длине, мне жаль, что я не написал его в Python, но _never_ однажды мне захотелось записать его в пакетном скрипте cmd.exe Windows. –

Смежные вопросы