私の携帯電話に写真ファイルがいくつかあり、外付けドライブにバックアップしています。 (すべてはLinuxノートブックにインストールされます。)
ファイルをコピーしましたが、必ずmv
。
ところでこれで作業を行ったので、各ファイルごとにコピーされたデータが正しいことを確認し、エラーなくファイルがコピーされたら携帯電話からそのファイルを削除したいと思います。
だから私が本当に探しているのは、次cp
のコマンドですmv
。
- ターゲットにファイルがない場合は、ファイルをコピーしてください。
- ソースとターゲットの間のデータを確認する(コピー後にファイルがまだない場合)
- 両方のファイルのバイナリが同じ場合は、ソースからそのファイルを削除します。
私はこれを行うことができると思いましたが、rsync
削除に似たさまざまなオプションを見ましたが、「削除」では何も見つけることができませんでした。源泉代わりに、このオプションは(?)前/後/中からファイルを削除します。目的地代わりに。
ベストアンサー1
(注:rsync --remove-source-files
これはデータを検証しないことを除いて、私が探しているコマンドです。)
diff
バイナリ比較に関しては、次のことができることがわかりました。
ソースディレクトリから:
for f in *.jpg; do diff $f "/path/to/destination/$f"; done
ソースとターゲットのバイナリを比較します。出力なし = ファイルに違いはありません。
これは、データを検証するために使用できます。
diff
違いが見つからずに返されるので動作します。0
for f in *.jpg; do diff $f "/desination/$f" && rm $f; done
返されると、$f
ソースフォルダのファイルが削除されます。つまり、ファイルは同じバイナリです。diff
0
新しいコマンドのように見せると便利ですverify-rm
。これをと呼びます。
ドロップボックスがインストールされているので、6ヶ月後にOSを再インストールするときにバックアップの心配がないように、スクリプトをドロップボックスフォルダに入れます。
$ cd ~/Dropbox && mkdir my-scripts && cd my-scripts
$ vim verify-rm
これは私のverify-rm
スクリプトです。
if [ "$#" -lt 2 ];
then
echo "Bad arguments, use like cp command"
else
success=0
fail=0
error=0
for arg in ${@:1:$(($#-1))}
do
#echo "$arg ${@:(-1):1}"
diff "$arg" "${@:(-1):1}"
ret=$?
if [ $ret -eq 0 ]
then
success=$((success+1))
echo "Verified file $arg"
rm $arg
elif [ $ret -eq 1 ]
then
fail=$((fail+1))
echo "Binary files $arg and ${@:(-1):1} differ"
else
error=$((error+1))
echo "diff exited with error: code=$ret"
fi
done
echo "Summary: $success files verified and ok"
echo " $fail files differ!"
echo " $error errors"
echo "Files which differ not removed"
echo "Files where diff returned error code not removed"
fi
スクリプトを実行可能にする
$ chmod +x verify-rm
次に、新しいスクリプト(「コマンド」)を使用します。
$ verify-rm /path/to/source/*.jpg /path/to/destination
ファイル名にスペースが含まれているファイルは、bashがスペース間の各文字セットを異なる引数として扱うため、正しく処理されないことがわかりました。何をすべきか、修正できるかどうかはわかりません。
rsync --remove-source-files
しかし、コメントはファイル名に空白があってもうまくいき、うまく機能すると言われており、rsync
速度もはるかに高速であることがわかったので、単に使用することをお勧めしますrsync
。