このコマンドを実行しようとしています。
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/$DirNew
。pwd
echo $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
注:コードはテストされていません。