BASH filepath и файловые команды - PullRequest
0 голосов
/ 15 марта 2012

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

Я смог заставить это работать после установки некоторых дополнительных функций для моего 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

Ответы [ 3 ]

1 голос
/ 15 марта 2012

Если ваша 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
1 голос
/ 15 марта 2012

Лучшая ставка будет на 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

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

0 голосов
/ 15 марта 2012

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

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

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

РЕДАКТИРОВАТЬ: я изначально не понимал, что цель всегда была локальной в любом случае.

...