2

私はbashでこのようなことをしたい:

scp me@server:/data/stuff/*/needthis.txt ./?/needthis.txt

どこ?コマンドでは、* によって一致したものになります。

私の問題は、各ディレクトリに同じ名前の1つのファイルをコピーしたいディレクトリがたくさんあり、元のディレクトリの名前を保持したいのですが、全体をコピーしたくないだけですこれらのディレクトリには数百 MB の他のファイルがあり、ダウンロードに時間を無駄にしたくないためです。

これは簡単にできますか?

4

3 に答える 3

1

この解決策は非常に厄介で、scp が複数回呼び出されるため、おそらく効率的ではありません。

ssh me@server 'find /data/stuff -name needthis.txt' 2>/dev/null | \
    while read src; do
        dest=.${src#/data/stuff}
        echo mkdir -p $(dirname $dest)
        echo scp "me@server:$src" "$dest"
    done

説明

  1. 最初の行: サーバーにリモート ログインし、関心のあるすべてのファイルを見つけます。この2>/dev/nullフレーズは、ssh コマンドによって発生した余分な出力を破棄します。最初の行の結果は、ファイル名のリストであり、完全なパスがあり、1 行に 1 ファイルです。
  2. 2 行目:whileステートメントは、これらの各ファイルを変数に読み込みますsrc
  3. 3 行目: 破棄/data/stuffして単一のドット (現在のディレクトリ) に置き換えることにより、宛先ファイルを作成します。
  4. 4 行目と 5 行目: ソースと一致するディレクトリ構造をローカル マシン上に作成し、コピーします。ただし、echo コマンドは実際の実行を妨げます。代わりに、コマンド自体が表示されます。

次に、このかなり長いコマンドを実行して、出力を調べます。満足したら、2 つechoを削除して再度実行します。今回は実行が実際に行われます。私はこの解決策が長くて厄介であることを知っているので、専門家からの意見に感謝します。

于 2012-10-26T19:42:59.020 に答える
1

宛先ファイルがすべてローカル マシンに存在する場合は、次の操作を実行できます。

for file in */needthis.txt; do
    scp me@server:/data/stuff/$file $file
done
于 2012-10-26T19:43:57.540 に答える
1

おそらくrsyncあなたが必要とするものです:

rsync -a --exclude='*' --include=needthis.txt me@server:/data/stuff/. .
于 2012-10-26T19:22:19.243 に答える