まず、使用しないでください:
for item in $(find ...)
コマンドラインをオーバーロードする可能性があるためです。また、 for ループは のプロセスが$(...)
終了するまで開始できません。その代わり:
find ... | while read item
ファンキーなファイル名にも注意する必要があります。ループは、for
スペースを含むすべてのファイルで咳をします。ファイルfind | while
の名前にスペースが 1 つだけ含まれていて、スペースが 2 つ含まれていない限り、これは機能します。より良い:
find ... -print0 | while read -d '' -r item
これにより、ファイル名の間にヌルが挿入read
され、それらのヌルで中断されます。このようにして、スペース、タブ、改行、または問題を引き起こす可能性のあるその他のものを含むファイルを問題なく読み取ることができます。
あなたのsed行は次のとおりです。
R2K_TEMP_DIR=$( sed 's/"$R2K_SOURCE"/"$R2K_PROCESSED"/g' $file )
$file
これがしようとしているのは、ディレクトリであるあなたの編集です。あなたがしたいことは、ディレクトリ名自体を変更することです。したがって、名前をsed
パイプとしてエコーする必要があります。
R2K_TEMP_DIR=$(echo $file | sed 's/"$R2K_SOURCE"/"$R2K_PROCESSED"/g')
ただし、環境変数パラメータを使用して環境変数をフィルタリングする方がよい場合があります。
基本的に、というディレクトリがあり、source/
探しているすべてのファイルはそのディレクトリの下にあります。あなたは単に変更したい:
source/foo/bar
に
processed/foo/bar
この ${file#source/} のようなことができます。は#
、これが左側のフィルターであり、#
. マンページをチェックして、Parameter Expansionbash
の下を見てください。
これは、次のようなことができます。
#!/bin/sh
R2K_SOURCE="source/"
R2K_PROCESSED="processed/"
R2K_TEMP_DIR=""
echo " Procesando archivos desde $R2K_SOURCE "
find $R2K_SOURCE -print0 | while read -d '' -r file
do
if [ -d $file ]
then
R2K_TEMP_DIR="processed/${file#source/}"
echo "directorio $R2K_TEMP_DIR"
else
# some code executes
:
fi
done
R2K_TEMP_DIR="processed/${file#source/}"
source/
の先頭から を削除し、その場所に$file
追加するだけです。processed/
さらに良いことに、それははるかに効率的です。元のスクリプトでは、$(..)
別のシェル プロセスを作成して実行echo
し、別のプロセスにパイプして実行しますsed
。( loentarのソリューションを使用すると仮定します)。実行中のサブプロセスはもうありません。ディレクトリ名の変更全体は内部的なものです。
ちなみに、これもうまくいくはずです:
R2K_TEMP_DIR="$R2K_PROCESSED/${file#$R2K_SOURCE}"
私はそれをテストしませんでした。