使用ls以特定顺序的scp文件

时间:2014-04-14 18:12:41

标签: scp ls

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

我已经找到了一种简单但不太优雅的方式来保持所需的订单,如下所述。有一种聪明的方法吗?

修改:从此处删除了我的早期解决方案,使用其他建议进行了清理和调整,并在下面添加了答案。

3 个答案:

答案 0 :(得分:4)

要将文件从本地计算机(例如您的笔记本电脑)发送到远程计算机(例如您的计算服务器),您可以使用Merlin2011的聪明解决方案:

  1. 进入本地计算机中要从中复制文件的文件夹。
  2. 执行scp命令,假设您有远程服务器的访问密钥:
    scp -r $(ls -rt) user@foo.bar:/where/you/want/them/.
  3. 注意:如果您没有公共访问密钥,最好使用tar执行类似操作,然后发送tar文件,即{{1}然后使用tar -zcvf files.tar.gz $(ls -rt)发送该tar文件。


    但要做到这一点,你可能无法直接从远程服务器运行scp命令将文件发送到笔记本电脑。相反,您可能需要,让文件带入您的笔记本电脑。我的蛮力解决方案是:

    1. 在远程服务器中,scp进入要从中复制文件的文件夹。
    2. 按所需顺序创建文件列表。例如,对于相反的创建顺序(最近复制的最后一个):
      cd
    3. 现在您需要添加每个文件名的路径。在转到列表所在的目录之前,使用ls -rt > ../filenames.txt打印路径。现在开始:pwd
    4. 您现在需要将此路径添加到列表中的每个文件名。有很多方法可以做到这一点,这里有一个使用awk:
      cd ..
    5. 您需要将文件名放在同一行中,并以空格分隔,因此请将换行更改为空格:
      cat filenames.txt | awk '{print "path/to/files/" $0}' > delete_me.txt
    6. 将filenames.txt获取到本地服务器,并将其放在要将文件复制到的文件夹中。
    7. scp run将是:
      tr '\n' ' ' < delete_me.txt > filenames.txt
    8. 同样,这假设您有一个私人访问密钥,否则它对scp -r user@foo.bar:"$(cat filenames.txt)" .远程文件更加简单,并带来它。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

您可以使用xargs

在没有中间件的情况下在一行中执行此操作
 ls -r <directory> | xargs -I {} scp <Directory>/{} user@foo.bar:folder/

当然,如果您没有公钥验证,则需要多次输入密码。

您也可以使用cd并仍然跳过中间文件。

 cd <directory>
 scp $(ls -r) user@foo.bar:folder/