特定の所有者のすべてのファイルを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したいのでfile1
、file4
とfile5
。
似たようなものがありますか
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