scp файлы в определенном порядке, используя ls

Всякий раз, когда я пытаюсь использовать SCP-файлы (в bash), они оказываются в случайном (?) Порядке.

Я нашел простой, но не очень элегантный способ соблюдения желаемого порядка, описанный ниже. Есть ли умный способ сделать это?

Изменить: отсюда удалил мое раннее решение, очистил, адаптировал, используя другие предложения, и добавил в качестве ответа ниже.

3 ответа

Решение

Чтобы отправить файлы с локального компьютера (например, с вашего ноутбука) на удаленный (например, на сервер вычислений), вы можете использовать умное решение Merlin2011:

  1. Перейдите в папку на локальном компьютере, откуда вы хотите скопировать файлы.
  2. Выполнить scp команда, если у вас есть ключ доступа для удаленного сервера:
    scp -r $(ls -rt) user@foo.bar:/where/you/want/them/.

Примечание: если у вас нет открытого ключа доступа, может быть лучше сделать что-то подобное, используя tar, а затем отправить файл tar, т.е. tar -zcvf files.tar.gz $(ls -rt), а затем отправить этот файл tar самостоятельно, используя scp,


Но сделать это иначе вы не сможете запустить 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 файл в пульте, и принесите это.

Можно добиться передачи файлов в алфавитном порядке, используя rsync:

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

P позволяет частичную загрузку, e устанавливает протокол SSH и r загружает рекурсивно.

Вы можете сделать это в одну строку без использования промежуточного xargs:

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

Конечно, это потребует от вас ввода пароля несколько раз, если у вас нет аутентификации с открытым ключом.

Вы также можете использовать cd и все же пропустить промежуточный файл.

 cd <directory>
 scp $(ls -r) user@foo.bar:folder/
Другие вопросы по тегам