按照ls命令的顺序使用scp传输文件

7
每当我尝试在bash中传输文件(SCP),它们看起来会以一个似乎随机(?)的顺序结束。

我发现保持所需顺序的一种简单但不太优雅的方法,如下所述。是否有更聪明的方法呢?编辑:从这里删除了我的早期解决方案,清理并使用其他建议进行调整,并将其作为下面的答案添加。

1
我很好奇:为什么目标机器上文件的创建顺序很重要?你有什么问题吗? - lurker
为什么需要中间文件? - merlin2011
潜水者:我正在处理模拟文件,所以我需要知道哪个先来。 merlin2011:我完全不知道!我只是找不到一个聪明的方法来做这件事。 kojiro:感谢您的纠正。当然我是指ls -rt。现在已经修复了。我在Mac上本地工作,并在Scientific Linux上的远程服务器上运行模拟,我想它们都有一个创建顺序(时间-日期)。 - Vicks
2
@user3532942:很好。我个人更愿意在名称中添加复杂性,而不是依赖于时间戳携带重要信息在不同系统上100%同步(例如,这会使备份变得复杂)。您可以在生产后使用脚本重命名输出文件。 - Benjamin Bannier
请参考SuperUser上的这个问题。 - Ruslan
显示剩余4条评论
3个回答

6
要将文件从本地机器(例如您的笔记本电脑)发送到远程计算服务器(例如您的计算服务器),您可以使用Merlin2011的聪明解决方案:
  1. 进入您想要从中复制文件的本地机器文件夹。
  2. 执行scp命令,假设您有远程服务器的访问密钥:
    scp -r $(ls -rt) user@foo.bar:/where/you/want/them/.
注意:如果您没有公共访问密钥,则最好使用类似的方法使用tar,然后发送tar文件,即tar -zcvf files.tar.gz $(ls -rt),然后仅使用scp发送该tar文件。
但是,要以另一种方式运行,您可能无法直接从远程服务器运行scp命令将文件发送到例如您的笔记本电脑。相反,您可能需要将文件“带入”到您的笔记本电脑中。我的暴力解决方案是:
  1. 在远程服务器上,cd进入要从中复制文件的文件夹。
  2. 按您想要的顺序创建文件列表。例如,对于反向创建顺序(最近复制的最后一个):
    ls -rt > ../filenames.txt
  3. 现在需要将路径添加到每个文件名中。在上一级目录之前,使用pwd打印路径。现在进入上一级目录:cd ..
  4. 您现在需要将此路径添加到列表中的每个文件名中。有许多方法可以做到这一点,以下是使用awk的一种方法:
    cat filenames.txt | awk '{print "path/to/files/" $0}' > delete_me.txt
  5. 您需要将文件名放在同一行中,由空格分隔,因此将换行符更改为空格:
    tr '\n' ' ' < delete_me.txt > filenames.txt
  6. 获取filenames.txt并将其放入要将文件复制到其中的文件夹中。
  7. scp运行如下:
    scp -r user@foo.bar:"$(cat filenames.txt)" .
类似地,这假设您具有私有访问密钥,否则在远程计算机中将文件打包成tar文件并将其带入会更简单。

6

使用rsync可以按字母顺序实现文件传输:

rsync -P -e ssh -r user@remote_host:/some_path local_path

P 允许部分下载,e 设置 SSH 协议,r 递归下载。


1

您可以使用xargs在一行中完成操作,而不需要中间步骤:

 ls -r <directory> | xargs -I {} scp <Directory>/{} user@foo.bar:folder/

当然,如果您没有公钥认证,这将需要您多次输入密码。
您也可以使用“cd”,跳过中间文件。
 cd <directory>
 scp $(ls -r) user@foo.bar:folder/

在OS X上,ls -r将反转列出的文件顺序。但默认情况下,ls按字典顺序而非年龄顺序列出文件。 - kojiro
2
@kojiro,在Linux上也是如此。然而,OP并没有明确指定他实际想要哪个顺序,只是想要一个特定的顺序。此外,他在自己的命令中使用了“-r”标志(没有“-t”),因此我认为那就是他想要的排序方式。 - merlin2011
@merlin2011:非常有用的建议,让我的代码更简洁了。我已经在原始代码中进行了修改(并标注了您的贡献)。那么反过来呢?也就是说,从远程复制到本地是否可行?我仍然想不出其他方法,只能使用我现在的这种方式。 - Vicks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接