当使用 scp 递归复制 dir 时,如何过滤文件?

我需要复制所有。类文件从服务器到本地保留所有目录。例如,server:/usr/some/unknown/number/of/sub/folders/me.class将是 /usr/project/backup/some/unknown/number/of/sub/folders/me.class问题是,还有许多其他无用的文件,如。我不想要的 svn-base 文件。我怎样才能过滤他们,所以我只有 scp。类文件?

142722 次浏览
  1. Copy your source folder to somedir:

    cp -r srcdir somedir

  2. Remove all unneeded files:

    find somedir -name '.svn' -exec rm -rf {} \+

  3. somedir启动 scp

Scp 中没有过滤文件的功能:

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

(此行将 rsync 从远程文件夹复制到当前文件夹)

默认情况下,rsync 的最新版本会自动通过 ssh 连接进行隧道。

由于它的 includeexclude标志,例如:-,我可能会推荐使用类似于 rsync的东西

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/

Some other useful flags:

  • -r表示递归
  • -a用于存档(大部分是所有文件)
  • -v for verbose output
  • -e to specify ssh instead of the default (which should be ssh, actually)

既然你可以 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 ...)对于你的焦油变化来说太长了,

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

最后,因为你把它保存在 /usr/project/backup/中,
为什么要提取呢? 只要保持 tar.bz2,也许日期 + 时间戳。

排除基本目录中的 dotfiles:

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

[!.]* is a shell glob that expands to all files in working directory not starting with a dot.

With ssh key based authentication enabled, the following script would work.

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

下面是文件的命令。

- name“ hs _ err _ pid2801. log”-type f‘ root@IP:/tmp/test/

  1. IP 将是目标服务器的 IP 地址。
  2. - 名称“ * . log”用于包含文件。
  3. !-名称“ hs _ err _ pid2801. log”用于排除文件。
  4. 。是目前的工作目录。
  5. - 类型 f 表示文件类型。

下面是目录的命令。

- maxdeep 1-name“ lo *”!-name“ localhost”-type d‘ root@IP:/tmp/test/

you can customize above command as per your requirement.

如果您确实想要使用 scp,那么有一个间接的方法 。说我们要复制所有。远程服务器10.1.1.2中本地文件夹“/src”下的 jpg 文件到文件夹“/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
scp -i /home/<user>/.ssh/id_rsa -o "StrictHostKeyChecking=no" -rp /source/directory/path/[!.]* <target_user>@<target_system:/destination/directory/path