2017-07-20 3 views
0

ソースディレクトリからコピー先ディレクトリにファイルを移動するシェルスクリプトを作成しました。moveコマンドもソースディレクトリ内で移動を実行します

/home/tmp/ to /home/from/

動きが正確に起こるが、それはメッセージ

mv: /home/tmp/testfile_retry_17072017.TIF 
/home/tmp/testfile_retry_17072017.TIF are identical. 

を表示し、ソースディレクトリが空の場合、それは/home/tmp/*

if [ -f "$file" ] 
then 
    do 
     DIRPATH=$(dirname "${file}") 
     FILENAME=$(basename "${file}") 
#  echo "Dirpath = ${DIRPATH} Filename = ${FILENAME}" 
     mv "${DIRPATH}/"${FILENAME} /home/from 
     echo ${FILENAME} " moved to from directory" 
    done 
else 
    echo "Directory is empty" 
fi 
にファイルを

mv: cannot rename /home/tmp/* to /home/from/* 

を表示3210

+0

「mv $ file/home/from'を実行するだけではどうですか? '$ DIRPATH/$ FILENAME'は' $ file'と同じです。 –

答えて

0

あなたはビットと秩序の外にものを持っている:もちろん"$file"

for file in /home/tmp/* 
if [ -f "$file" ] 
then 
    do 

が存在します - あなたはfor file in /home/tmp/*をループしています。あなたはdirnamebasenameを呼び出さないようすることができパラメータ展開が含まPOSIXシェル:あなたは

for file in /home/tmp/* 
do 
    FILENAME=$(basename "${file}") 
    if [ ! -f "/home/from/$FILENAME" ] ## if it doesn't already exist in dest 
    then 

注意を意図したように見えます。代わりに、"${file##*/}"をファイル名に使用することができます(はすべてから最後の/まで)。それはあなたが必要とする唯一の拡張です(あなたが既に目的地のディレクトリ名を知っているので)。これは、あなたがすでに動いている同じ名前のファイルがあなたがしてあなたの利点にそれを使用することができ/home/from

に存在するかどうかを判断するために[ -f "$dest/${f##*/}" ]を確認することができます:

src=/home/tmp   ## source dir 
dst=/home/from   ## destination dir 

for f in "$src"/*  ## for each file in src 
do 
    [ "$f" = "$src/*" ] && break ## src is empty 
    if [ -f "$dst/${f##*/}" ] ## test if it already exists in dst 
    then 
     printf "file '%s' exists in '%s' - forcing mv.\n" "${f##*/}" "$dst" 
     mv -f "$f" "$dst"  ## use -f to overwrite existing 
    else 
     mv "$f" "$dst"   ## regular move otherwise 
    fi 
done 

をチェックするための素晴らしいリソースがあり、あなたのシェルコードはShellCheck.netとなります。 Webページにコードを入力(または貼り付ける)するだけで、ロジックと変数の使用状況が分析され、問題の特定場所がわかります。

ご質問がある場合は、私に連絡してください。

+0

こんにちは、ありがとうございます。私の懸念は、宛先に存在するファイルに関するものではありません。ソースディレクトリにファイルが存在しないということです。スクリプトは定期的に実行され、ソースディレクトリにファイルがない場合があります。 –

+0

@asmitathakur - 私は、空のソースディレクトリをキャッチし、そのイベントで単に 'break'でループを終了するためのチェックを追加しました。 –

0

ここに示すように、/ home/tmp/*の代わりにfindを使用してください。

for file in $(find /home/tmp/ -type f) 
do 
if [ -f "$file" ] 
then 
     DIRPATH=$(dirname "${file}") 
     FILENAME=$(basename "${file}") 
#  echo "Dirpath = ${DIRPATH} Filename = ${FILENAME}" 
     mv "${DIRPATH}/"${FILENAME} /home/from 
     echo ${FILENAME} " moved to from directory" 
else 
    echo "Directory is empty" 
fi 

done 
+0

まだ同じメッセージが届いています –

+0

名前が「*」の/ tmpディレクトリにファイル名があるとします。そのファイルを削除します。それはうまくいくはずです。 –

+0

このようなファイルはありません。たとえディレクトリが空であっても、コードは*をファイル名と見なし、他のブロックには入っていないようです。 –

関連する問題