根据文件名列表通过 ssh 下载文件

根据文件名列表通过 ssh 下载文件

这就是我已经做了的事情:

我有一个名为 abc.txt 的文件,其中包含文件列表。我使用 abc.txt 将这些文件移动到一个文件夹,对该文件夹进行 tar,最后从运行 GNU/Linux 的服务器将 tar 下载到本地 PC。

以下是列表形式的步骤:

  1. abc.txt
  2. abc.txt(列出的文件)-> 文件夹
  3. 文件夹 -> 文件夹.tar
  4. folder.tar -> 本地 PC。

如果 abc.txt 包含 2 个文件,例如:

example1.css
example2.css

我需要将这些文件从 abc.txt 单独下载到本地 PC。

由于 ftp 或 sftp 需要文件名才能下载它,我如何从 abc.txt 中读取该文件名?

答案1

如果文件abc.txt包含相对于 的文件名列表/path/to/base

ssh user@server tar c -T /path/to/abc.txt -C /path/to/base | (cd /tmp; tar xv)

这会动态创建一个 tarball,而无需实际将其保存在任何地方,将其通过管道传输到本地 shell,提取,有效地复制列出的文件。

额外提示

如果文件abc.txt包含绝对路径列表:

ssh user@server tar c -T /path/to/abc.txt | (cd /tmp; tar xv)

如果文件abc.txt位于本地系统而不是远程系统上:

ssh user@server tar c -T- < /path/to/abc.txt | (cd /tmp; tar xv)

要使用gzip压缩(使用默认级别 6):

ssh -C user@server tar c -T /path/to/abc.txt | (cd /tmp; tar xv)

要使用gzip压缩级别 9:

ssh user@server 'tar c -T /path/to/abc.txt | gzip -9' | (cd /tmp; tar zxv)

答案2

这是一个简单的脚本,适用于文件名中包含空格的文件:

SAVEIFS=$IFS; IFS=$(echo -en "\n\b") ; for elt in `cat abc.txt` ; do scp $elt <YOUR_SFTP_CONNECTION> ; done ; IFS=$SAVEIFS

答案3

我认为您问题的核心是如何从列表中提取后续两个逻辑路径的正确文件。

egrep 'example1.css|example2.css' abc.txt

将为您提供与例外情况匹配的所有行,并且

egrep -v 'example1.css|example2.css' abc.txt

将为您提供所有与异常不匹配的行

相关内容