2012-03-14 1 views
0

Я пытаюсь воссоздать структуру папок из источника в целевом местоположении и выполнить команду для каждого файла, найденного в процессе, используя BASH. На основании некоторой обратной связи и некоторых запросов я пытаюсь получить это решение для правильной работы. Сейчас он ломается, потому что в папках Windows есть каталоги с пробелами, которые он не находит.Batch filepath и команды файлов

Я смог заставить это работать после установки некоторых дополнительных функций для моего cygwin.

source='/cygdrive/z/austin1/QA/Platform QA/8.0.0/Test Cases' 
target='/cygdrive/c/FullBashScripts' 
# let ** be recursive 
shopt -s globstar 
for file in "$source"/**/*.restomatic; do 
    cd "${file%/test.restomatic}" 
    locationNew="$target${file#$source}" 
    mkdir -p "$(dirname "$target${file#$source}")" 
sed -e 's/\\/\//g' test.restomatic | awk '{if ($1 ~ /^(LOAD|IMPORT)/) system("cat " $2); else print;}' | sed -e 's/\\/\//g' |awk '{if ($1 ~ /^(LOAD|IMPORT)/) system("cat " $2); else print;}' > $locationNew 
done 
+0

Я сделал изменения в мой ответ, который должен заботиться о пространствах в именах файлов; попробуй. –

ответ

1

Если ваша версия bash 4 или выше, это должно работать:

source="testing/web testing/" 
target="c:/convertedFiles/" 
# let ** be recursive 
shopt -s globstar 
for file in "$source"/**/*.test; do 
    newfile= "$target/${file#$source}" 
    mkdir -p "$(dirname "$newfile")" 
    conversion.command "$file" > "$newfile" 
done 

${file#$source} Lops $source от начала $file.

Если вы можете гарантировать, что никакие файлы не имеют перевода строки в имени, вы можете использовать find, чтобы получить имена:

source="testing/web testing/" 
target="c:/convertedFiles/" 

find "$source" -name \*.test | while read file; do 
    newfile= "$target/${file#$source}" 
    mkdir -p "$(dirname "$newfile")" 
    conversion.command "$file" > "$newfile" 
done 
+0

не уверен, что это за ошибка ... недействительный вариант оболочки namept: globstar – jheep

+0

Хмм. Я не вижу 'globstar' в списке моих параметров оболочки ... также, будет ли он правильно воссоздавать путь в целевом каталоге или будет ли попытка перенаправления неудачной, если этот путь не существует? –

+0

@jheep Это относительно новый вариант (http://www.linuxjournal.com/content/globstar-new-bash-globbing-option). У вас может не быть этого в вашей системе. Я знаю, что нет, поэтому неплохо полагаться на этот вариант, если вы ожидаете совместимости с произвольными системами. –

1

Лучше бы find, чтобы получить список файлов:

Вы можете сделать это следующим образом:

export IFS=`/bin/echo -ne "\n"`   # set field separator to new lines only 
cd testing        # change to the source directory 
find . -type d > /tmp/test.dirs   # make a list of local directories 
for i in `cat /tmp/test.dirs`; do  # for each directory 
    mkdir -p "c:/convertedFiles/$i"  # create it in the new location 
done 
find . -iname *.test > /tmp/test.files # record local file paths as needed 
for i in `cat /tmp/test.files`; do  # for each test file 
    process "$i" > "c:/convertedFiles/$i" # process it and store in new dir 
done 

Обратите внимание, что это не самый оптимальный путь - но проще всего понять и следовать. Это должно работать с пробелами в именах файлов. Возможно, вам придется подстроить его дальше, чтобы заставить его работать под окнами.

+0

cd "c:/TestingSource /" найти. -iname * .restomatic> /tmp/test.files tar --files-from =/tmp/test.files -cvf /tmp/test.tar cd "c:/TestingTarget /" tar xvf/tmp/test .tar , похоже, не работает, я что-то упустил? Также, где бы я выполнял команду sed в файлах в этом скрипте? – jheep

+0

@jheep Перезагрузите страницу - я изменил ответ, потому что сначала неправильно понял вашу проблему. –

+0

Нет причин для временного файла, вам лучше просто использовать 'for i в $ (find -type d); делать ... '. Кроме того, никакие пробелы не являются очень хорошим предположением на машине Windows. – Kevin

-1

Я бы рассмотрел инструмент под названием sshfs или Secure Shell File System. Он позволяет монтировать часть удаленной файловой системы где-то локально для вас.

После того, как у вас есть удаленное фс установлено локально, можно запустить сценарий последующей оболочки:

for f in *.*; 
do 
    echo "do something to $f file.."; 
done 

EDIT: Я сначала не понял, что цель всегда была локальной так или иначе.