107

すべての.classファイルをサーバーからローカルにコピーし、すべてのディレクトリを予約する必要があります。たとえば、問題server:/usr/some/unknown/number/of/sub/folders/me.classになる/usr/project/backup/some/unknown/number/of/sub/folders/me.classのは、.svn-baseファイルなど、私が望まない他の多くの役に立たないファイルがあることです。どうすればそれらをフィルタリングして、scp.classファイルのみにすることができますか?

4

9 に答える 9

165

フラグがあるrsyncため、このincludeようなものを使用することをお勧めします。例:-exclude

rsync -rav -e ssh --include '*/' --include='*.class' --exclude='*' \
server:/usr/some/unknown/number/of/sub/folders/ \ 
/usr/project/backup/some/unknown/number/of/sub/folders/

その他の便利なフラグ:

  • -r再帰用
  • -aアーカイブ用(ほとんどすべてのファイル)
  • -v詳細出力用
  • -eデフォルトの代わりにsshを指定する(実際にはsshである必要があります)
于 2009-08-04T16:27:15.957 に答える
84

ベースディレクトリ内のドットファイルを除外するには:

scp -r [!.]* server:/path/to/something

[!.]*は、ドットで始まらない作業ディレクトリ内のすべてのファイルに展開されるシェルグロブです。

于 2015-02-12T14:10:36.493 に答える
43

scpにはファイルをフィルタリングする機能はありません。このような「高度な」ものについては、rsyncを使用することをお勧めします。

rsync -av --exclude '*.svn' user@server:/my/dir .

(この行は、rsyncを離れたフォルダーから現在のフォルダーにコピーします)

ssh接続を介したrsyncトンネルの最近のバージョンはデフォルトで自動的に行われます。

于 2009-08-04T16:25:20.297 に答える
11

あなたは大丈夫であるはずなので、scp次 のスクリプトを書くか、ログインして実行してください...ssh

# After reaching the server of interest
cd /usr/some/unknown/number/of/sub/folders
tar cfj pack.tar.bz2 $(find . -type f -name *.class)

ローカルサーバーに戻る(ログアウト)とscp

# from the local machine
cd /usr/project/backup/some/unknown/number/of/sub/folders
scp you@server:/usr/some/unknown/number/of/sub/folders/pack.tar.bz2 .
tar xfj pack.tar.bz2

$(find ...)tarをに変更するには長すぎることがわかった場合は、

find . -type f -name *.class | xargs tar cfj pack.tar.bz2

最後に、あなたはそれを保持しているので/usr/project/backup/
なぜわざわざ抽出するのですか?tar.bz2日付とタイムスタンプを付けて、そのままにしておいてください。

于 2009-08-04T17:07:46.233 に答える
2

以下のファイルのコマンド。

scp`find。-maxdepth 1 -name "* .log" \!-name "hs_err_pid2801.log" -type f` root @ IP:/ tmp / test /

  1. IPは宛先サーバーのIPアドレスになります。
  2. -インクルードファイルの名前は「*.log」です。
  3. \!-除外ファイルの名前は「hs_err_pid2801.log」です。
  4. 。現在の作業ディレクトリです。
  5. -ファイルタイプの場合はfと入力します。

ディレクトリのコマンドの下。

scp-r`find。-maxdepth 1 -name "lo *" \!-name "localhost" -type d` root @ IP:/ tmp / test /

要件に応じて、上記のコマンドをカスタマイズできます。

于 2017-11-29T11:37:32.180 に答える
1

sshキーベースの認証を有効にすると、次のスクリプトが機能します。

for x in `ssh user@remotehost 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo 'user@remotehost:'$x) /usr/project/backup$y/; done
于 2016-01-04T11:23:06.023 に答える
1

本当にscpを使用したい場合は、間接的な方法があります。ローカルフォルダー「/src」の下のすべての.jpgファイルをリモートサーバー10.1.1.2のフォルダー「/dst」にコピーするとします。

#make a clean temp folder
mkdir /tmp/ttt
#copy all .jpg file and retain folder structure as-is
find /src -type f -name *.jpg -exec cp --parents \{\} /tmp/ttt \;
#copy to remote target folder as-is and retain original time attributes
scp -rp /tmp/ttt/* 10.1.1.2:/dst
#if copy ok, remove temp folder
rm -rf /tmp/ttt
于 2018-03-22T12:56:11.980 に答える
0
scp -i /home/<user>/.ssh/id_rsa -o "StrictHostKeyChecking=no" -rp /source/directory/path/[!.]* <target_user>@<target_system:/destination/directory/path
于 2020-02-03T16:38:34.803 に答える
-3
  1. somedirソースフォルダを次の場所にコピーします。

    cp -rsrcdir somedir

  2. 不要なファイルをすべて削除します。

    somedir -name'.svn' -exec rm -rf {}\+を検索します

  3. からscpを起動しますsomedir

于 2009-08-04T16:21:11.383 に答える