【问题标题】:scp files in a certain order using ls使用 ls 按特定顺序创建 scp 文件
【发布时间】:2014-05-28 19:56:40
【问题描述】:

每当我尝试 SCP 文件(在 bash 中)时,它们最终都会以看似随机的(?)顺序结束。

我找到了一种简单但不太优雅的方法来保持所需的顺序,如下所述。有没有巧妙的办法?

编辑:从这里删除我的早期解决方案,清理,使用其他建议进行调整,并在下面添加为答案。

【问题讨论】:

  • 我很好奇:为什么在目标机器上创建文件的顺序很重要?你的问题是什么?
  • 为什么需要中间文件?
  • 两件事:1. 没有特殊(和不寻常的)文件系统修改,大多数 UNIX 系统是incapable of telling you when a file was created。他们能做的最好的事情是mtime,这是最后修改时间。 2. ls -lr 将按字典顺序列出文件,而不是任何基于时间的排序。
  • 谢谢! lurker:我正在处理模拟文件,所以我需要知道哪个先出现。 merlin2011:我一点也不!我只是找不到一个聪明的方法来做到这一点。小次郎:谢谢指正。当然,我的意思是 ls -rt。现在修好了。我想我在 Mac 上本地工作,并在 Scientific Linux 上的远程服务器上运行模拟。它们都有创建顺序(时间-日期)。
  • @user3532942:很公平。我个人宁愿增加名称的复杂性,也不愿依赖携带导入信息的时间戳在不同系统上 100% 同步(例如,这会使备份复杂化)。您可以在生产后使用脚本重命名输出文件。

标签: scp ls


【解决方案1】:

要将文件从本地机器(例如您的笔记本电脑)发送到远程(例如您的计算服务器),您可以使用 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 文件并带上它要简单得多。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      您可以使用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,在 Linux 上也是如此。但是,OP 没有明确指定他真正想要的订单,只是说他想要一个特定的订单。此外,他在自己的命令中使用了-r 标志(没有-t),所以我认为这是他想要的顺序。
      • @merlin2011:对简化我的代码很有帮助的建议。我在原版中这样做了(并归功于你)。反过来呢?即,这可以从本地工作到远程,从远程复制怎么样?除了我使用的方法,我仍然想不出任何其他方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 2019-10-08
      • 2023-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多