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


98

すべての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ファイルのみをフィルター処理するにはどうすればよいですか?


上記のrsyncオプションが気に入っています。これが1回限りの操作であるかどうか、またはこれを繰り返し自動化するかどうかについては触れませんでした。1回限りの操作の場合、find、grep -v、xargs、および一時ファイルを慎重に使用すると、この作業を簡単に行うことができます。
user47559 2009

回答:


151

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

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

4
とにかく、これに* classファイルが含まれていないサブフォルダーを無視するには?(つまり、空のディレクトリの束が欲しくない)
Grant Birchmeier 2013年

素晴らしく、これも非常に邪悪です!
Prasad Chalasani、2014

2
あなたはmanページでは--include、--includeない=を説明することができ、私は--include =なく--includeに説明を見つけることができる
bazz

1
このオプション-a-r、rsyncのマニュアルページに従ってすでに含まれています。
GeorgSchölly2017年

3
@GrantBirchmeier --prune-empty-dirsは空のディレクトリを削除します。
Elrond1337

74

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

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

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


10
これがおそらく最良の答えです。globsを使用してファイルをフィルタリングするのがよい方法です。
Yoshua Wuyts

1
あなたのオプションが私が持っていたようにscpに制限されている場合、これは間違いなく役立ちました。
user28095

3
これは、尋ねられたようなファイルを除外することを示していますが、これはディレクトリ全体に対してどのように達成できますか?
ピレ

37

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

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

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

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


10

あなたがすることができますので、scpあなたがに[OK]をする必要があり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たぶん日付とタイムスタンプを付けて、を保持してください。


これは私を助けました。私はWindowsを使用していて、OSにインストールしてインストールしようrsyncsshしています。代わりに、これは賢い回避策でした。ありがとう!
rayryeng 2018

2

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

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

  1. IPは宛先サーバーのIPアドレスになります。
  2. -name "* .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

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

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

0
scp -i /home/<user>/.ssh/id_rsa -o "StrictHostKeyChecking=no" -rp /source/directory/path/[!.]* <target_user>@<target_system:/destination/directory/path

1
口頭での説明は、コードと一緒にも便利です
CON

-1
  1. ソースフォルダをsomedir次の場所にコピーします。

    cp -r srcdir somedir

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

    somedir -name '.svn' -exec rm -rf {} \ +を見つけます

  3. からscpを起動する somedir


なぜこの回答に対するすべての反対票か これは、質問に対するviaソリューションのように聞こえます。
bcarroll 2014

7
これは不必要なファイルの束をコピーしてからそれらを削除するため、潜在的に多くの時間を無駄にします。
2015

いくつかのコンパイル手順を実行するプログラムの場合、これは実際には非常に理にかなっています。コンパイルされたコードをtarまたはファイルにパックするステップの直前に移動できzipます。代わりに、圧縮は行われず(scpが圧縮を行います)、「パッケージ化された」コードがコピーされます。
samvv 2016年

@samvvの真実(すべてセットアップ、環境に依存)
San Jay Falcon

スペースの制約のためにファイルが無視されている場合、これはスペースと時間を浪費します
jake
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.