Ubuntu 12.04 LTS 64 ビット。
何千ものファイルがあるディレクトリから Samba 共有へのスケジュールされたタスク コピーを作成しようとしています (重複をスキップしながら)。 GUI を使用して Samba 共有をマップしました。
試したコマンド:
cp /home/security/Brick/* ~/.gvfs/"atm-bak-01.local/Brick 上のカメラ" -n
これを見つけたのですが、構文を必要なものに変更する方法がわかりません。
find -maxdepth 1 -name '*.prj' -exec mv -t ../prjshp {} +
ヒントがあれば大歓迎です。
答え1
問題は、シェルが/home/security/Brick/*
長い(長すぎる)ファイルリストを展開することです。前にに渡しますcp
。
すべてのディレクトリをコピーしたい場合、Brick
おそらく最も簡単な方法は次のようになります。
cp -rn /home/security/Brick ~/.gvfs/"cam on atm-bak-01.local"/
「再帰」フラグを使用して を実行しますcp
。これにより、Brick の下のすべての構造もコピーされます (サブディレクトリを含む)。
1 つの可能性はfor
ループを使用することです。
for file in /home/security/Brick/*;
do
cp -n $file ~/.gvfs/"cam on atm-bak-01.local/Brick"
done
または find を使用します:
find /home/security/Brick/ -type f -exec cp -n {} ~/.gvfs/"cam on atm-bak-01.local/Brick" \;
このコマンドでは、-type f
ファイルのみ(ディレクトリなし)を選択し、各ファイルに対して指定されたコマンドを実行します。は{}
ファイル名に置き換えられ、は句\;
を閉じるために必要なセミコロンです-exec
。エスケープしないと、シェルがそれを解釈(および削除)します。
後のコマンドは-exec
何でも構いません(例えば、 の代わりに、アーカイブモード(タイムスタンプと妥当性を含む)でコピーして上書きするためにcp -n
使用しcp -av
たり、他のコマンド(しかし: シェルエスケープ、グロブ、引用符について事前に理解しておく必要があります。そうしないと、大きな損害が発生する可能性があります --- たとえば、「シェルの学習」)。
Findは非常に強力なコマンドです。よく学ぶ価値があります。興味深いチュートリアルを見つけました。ここ、ここそしてここ。
バックアップの実行についてcp -n
:
この-n
フラグは既存のファイルを上書きしないので、ローカルディレクトリ内の以前にコピーされたファイルに変更を加えた場合は、ない再度コピーされます...バックアップには古いバージョンが保存されます。
そのため、次のようなバックアップまたは同期ユーティリティを使用することをお勧めします。ユニゾンまたはrsync、この作業を行うには、 を使用します。これらのユーティリティは変更されたファイルを更新するだけなので、書き込み (およびネットワーク帯域幅) を最小限に抑えることができ、一般的にはるかに安全です。バックアップは、次rsync
のようにするだけで解決できます。
rsync -azvv /home/security/Brick ~/.gvfs/"cam on atm-bak-01.local/Brick"
(最後に「/」を追加しないように注意してください。そうしないと、rsync によってサブディレクトリ Brick/Brick が作成されます。はい、rsync
これは強力ですが、時々非常に気まぐれになります。)
Unison には優れたグラフィカル インターフェイスがあり、リポジトリ内に競合する変更があるかどうかも通知します。そのため、これが私の推奨オプションになります。