引数リストが長すぎるため、Samba Share にコピーしています

引数リストが長すぎるため、Samba Share にコピーしています

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 には優れたグラフィカル インターフェイスがあり、リポジトリ内に競合する変更があるかどうかも通知します。そのため、これが私の推奨オプションになります。

関連情報