特定の所有者のすべてのファイルをscpする方法は?

特定の所有者のすべてのファイルをscpする方法は?

特定の所有者のすべてのファイルをscpしたいと思います。たとえば、これが私の出力の場合ls -la

-rw-rw-r-- 1 owner1 ad   704 Jun  1 18:16 file1
-rw-rw-r-- 1 owner2 ad   798 May 29 11:15 file2
-rw-rw-r-- 1 owner2 ad   881 May 29 09:28 file3
-rw-rw-r-- 1 owner3 ad   936 May 29 09:28 file4
-rw-rw-r-- 1 owner1 ad  1012 Jun  1 15:14 file5

所有者1と3を持つすべてのファイルをscpしたいのでfile1file4file5

似たようなものがありますか

scp [email protected]:/path/to/folder/* . --owner owner1 owner2

答え1

最も効率的で安全な方法はおそらく次のとおりですfind | tar | tar

ssh [email protected] 'cd /path/to/folder; find . \( -user owner1 -o -user owner3 \) -print0 | tar --null -T - -cf -' | tar -xvf -

tarアーカイブを抽出する前に、tarアーカイブの内容を確認することをお勧めします。最後を次| tar -xvf -のように置き換えて| tar -tvf -実行し、ファイルのリストを取得します。

答え2

これを行うより短いコマンド/方法があるかどうかはわかりませんが、次のように動作します。

for i in * ; do [[ $(stat -c %U ./"$i") =~ owner1|owner3 ]] && scp -p [email protected]:/path/to/folder/ ./"$i"  ; done

stat -c %U現在のディレクトリ内のすべてのファイルを使用して所有者を確認し、scp所有者が所有者1または所有者3の場合は、ファイルの処理を続行します。

答え3

リモートサーバーがSFTPをサポートし、クライアントがそれを許可する場合ヒューズを押してからリモートディレクトリをマウントします。SSHFS。これにより、ローカルファイルとリモートファイルを心配することなく作業できます。どちらもファイルです。

mkdir ~/mnt
sshfs [email protected]:/path/to/folder ~/mnt

これで、一部のユーザーが所有するファイルをこのディレクトリにコピーする必要があります~/mnt。現在のディレクトリのすべてのファイルに対してこれを行うには(サブディレクトリのファイルを除く):

find . -name . -o -type d -prune -o \( -user owner1 -o owner3 \) -exec cp -p {} ~/mnt \;

現在のディレクトリを再帰的に移動し、すべてのファイルをターゲットディレクトリに配置します。名前の競合がある場合は、次のメッセージが表示されます。

find . \( -user owner1 -o owner3 \) -exec cp -ip {} ~/mnt \;

現在のディレクトリを再帰的に移動し、反対側にディレクトリツリーを再現するには、次のいずれかを使用できます。

find . \( -user owner1 -o owner3 \) -print0 | cpio -p0 ~/mnt
find . \( -user owner1 -o owner3 \) -exec pax -rw -pe {} ~/mnt \;

zshがあれば、zshを使用して所有者ごとにファイルを選択できるので、はるかに簡単です。グローバル予選

cp -p -- *(uowner1,uowner3) ~/mnt                   # not recursive
cp -ip -- **/*(uowner1,uowner3) ~/mnt               # recursive, flattened
zmv -C -Q -o-p '**/*(uowner1,uowner3)' '~/mnt/$f'   # reproduce tree

リモートファイル操作が完了したら、ファイルシステムをアンマウントします。

fusermount -u `/mnt
rmdir ~/mnt

関連情報