bash はスクリプトで exec cp 親を探します。

bash はスクリプトで exec cp 親を探します。

このコマンドを実行しようとしています。

for c in ax
do
mkdir $TgtDir$c/$Date
cd $TgtDir$c/$DirNew
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo $DIR
echo find . -iname $tgt -exec cp --parents {} ../$Date \;
find . -iname $tgt -exec cp --parents {} ../$Date \;
done

それは印刷する

/home/ax/new
find . -iname '*20170829*' -exec cp --parents {} ../20170829 ;

しかし、何もコピーしません。新しいディレクトリでここにechoedコマンドを実行すると(最後に\を追加した後にechoがエスケープを飲み込むようです)、正常に動作し、ファイルは/home/ax/20170829/…にコピーされます。

ここで見逃したアイデアはありますか?

答え1

私の考えでは、実際にはサブシェルで実行されているDIRディレクトリにはありませんが、残りのコマンドのcd作業ディレクトリはまだそこにあります$TgtDir$c/$DirNewpwdecho $DIR

回避策:直接呼び出してcd、サブシェルを使用したり、結果を変数に割り当てたりしないでください。コピーコマンドに絶対宛先パスを追加します。

for c in ax
do
    mkdir $TgtDir$c/$Date

    DIR=$( dirname "${BASH_SOURCE[0]}" )
    cd "${DIR}"
    pwd

    find . -iname $tgt -exec cp --parents {} $TgtDir$c/$Date \;
done

回避策:findコマンドの「。」代わりにソースディレクトリを使用してください。

for c in ax
do
    mkdir $TgtDir$c/$Date
    cd $TgtDir$c/$DirNew

    DIR=$( dirname "${BASH_SOURCE[0]}" )
    find "${DIR}" -iname $tgt -exec cp --parents {} ../$Date \;
done

注:コードはテストされていません。

関連情報