web-dev-qa-db-ja.com

scpを使用してディレクトリを再帰的にコピーするときにファイルをフィルタリングする方法は?

すべてのdirを予約して、すべての.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ファイルのみをフィルタリングする方法はありますか?

93
derrdji

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である必要があります)
141
Gavin Gilmour

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

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

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

65
rgtk

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

rsync -av --exclude '*.svn' [email protected]:/my/dir .

(この行はrsyncを遠くのフォルダーから現在のフォルダーにコピーします)

デフォルトでは、ssh接続を介したrsyncトンネルの最新バージョンが自動的に使用されます。

35
Ville Laurikari

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 [email protected]:/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_を保持するだけで、おそらく日付と時刻のスタンプを付けます。

8
nik

実際に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
1
Scott Chu

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

for x in `ssh [email protected] 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo '[email protected]:'$x) /usr/project/backup$y/; done
1
varun

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

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

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

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

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

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

1
Suneet Khurana