データの確認やファイル削除のための「cp」のような命令はありますか?

データの確認やファイル削除のための「cp」のような命令はありますか?

私の携帯電話に写真ファイルがいくつかあり、外付けドライブにバックアップしています。 (すべては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ソースフォルダのファイルが削除されます。つまり、ファイルは同じバイナリです。diff0

新しいコマンドのように見せると便利です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

おすすめ記事