scp файлы в определенном порядке, используя ls
Всякий раз, когда я пытаюсь использовать SCP-файлы (в bash), они оказываются в случайном (?) Порядке.
Я нашел простой, но не очень элегантный способ соблюдения желаемого порядка, описанный ниже. Есть ли умный способ сделать это?
Изменить: отсюда удалил мое раннее решение, очистил, адаптировал, используя другие предложения, и добавил в качестве ответа ниже.
3 ответа
Чтобы отправить файлы с локального компьютера (например, с вашего ноутбука) на удаленный (например, на сервер вычислений), вы можете использовать умное решение Merlin2011:
- Перейдите в папку на локальном компьютере, откуда вы хотите скопировать файлы.
- Выполнить
scp
команда, если у вас есть ключ доступа для удаленного сервера:scp -r $(ls -rt) user@foo.bar:/where/you/want/them/.
Примечание: если у вас нет открытого ключа доступа, может быть лучше сделать что-то подобное, используя tar
, а затем отправить файл tar, т.е. tar -zcvf files.tar.gz $(ls -rt)
, а затем отправить этот файл tar самостоятельно, используя scp
,
Но сделать это иначе вы не сможете запустить scp
Команда напрямую с удаленного сервера для отправки файлов, скажем, на ваш ноутбук. Вместо этого вам может понадобиться, скажем, принести файлы на ваш ноутбук. Мое решение грубой силы:
- На удаленном сервере
cd
в папку, из которой вы хотите скопировать файлы. - Создайте список файлов в нужном вам порядке. Например, для обратного порядка создания (последний скопирован последним):
ls -rt > ../filenames.txt
- Теперь вам нужно добавить путь к каждому имени файла. Прежде чем перейти в каталог, где находится список, распечатайте путь, используя
pwd
, Теперь поднимитесь:cd ..
- Теперь вам нужно добавить этот путь к каждому имени файла в списке. Есть много способов сделать это, вот один с использованием awk:
cat filenames.txt | awk '{print "path/to/files/" $0}' > delete_me.txt
- Вам нужно, чтобы имена файлов были в одной строке, разделенные пробелом, поэтому измените символы новой строки на пробелы:
tr '\n' ' ' < delete_me.txt > filenames.txt
- Получите файл filenames.txt на локальный сервер и поместите его в папку, в которую вы хотите скопировать файлы.
- Выполнение 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/