2012-03-14 14 views
0

ターゲットの場所にあるソースからフォルダ構造を再作成し、BASHを使用してプロセスで見つかった各ファイルに対してコマンドを実行しようとしています。いくつかのフィードバックといくつかの検索でこれを取得しようとしていますソリューションが適切に動作するようにします。 Windowsのフォルダには、検索を拒否するスペースのあるディレクトリが存在するため、今は壊れています。BASHのファイルパスとファイルコマンド

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}$fileの先頭から$sourceのLOP。

あなたはどのファイルがその名前に改行を持っていないことを保証することができる場合、あなたが名前を取得するために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

Hmm。私は '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 /" find。 -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

一時ファイルの理由はありません。$(find -type d)の 'for i 'を使う方が良いでしょう。 〜をしてください。また、スペースはWindowsマシンではあまり良い仮定ではありません。 – Kevin

-1

私は、sshfsという名前のツール、またはSecure Shell File Systemを調べます。リモートファイルシステムの一部をローカルのどこかにマウントすることができます。

リモートfsがローカルにマウントしたら、次のシェルスクリプトを実行することができます

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

EDITを:私は当初、そのターゲットは、とにかく常にローカルだった実現しませんでした。

関連する問題