Как мне скопировать все файлы и каталоги, кроме определенных, поверх ssh?

23

Используя командную строку Linux, я использую scpкоманду, чтобы скопировать все файлы и папки из определенного каталога. Однако я не люблю использовать пропускную способность, потому что копирую вещи, которые редко меняю, например, tiny_mceпапку. Какой трюк, чтобы скопировать все, но пропустить короткий список папок?

Майкл Прокопец
источник

Ответы:

19

rsyncработает нормально, и в большинстве случаев использует SSH автоматически в качестве транспортного протокола. Он будет сравнивать файлы и загружать только те, которые были изменены, но вы также можете использовать список исключений, чтобы указать файлы в дереве, которые не следует каким-либо образом пересылать.

Энтон
источник
rsync не использует SSH автоматически - для этого вы должны указать флаги "-e ssh".
4
Да, это так. Выпущена Rsync 2.6.0 - удаленная оболочка по умолчанию теперь называется "ssh", если только вы не скажете configure, что хотите сделать что-то другое по умолчанию. samba.org/rsync
12

Вы можете попробовать rsync, который копирует только файлы, которые были изменены, также работает через ssh.


источник
9

Использование здесь rsync --excludeявляется более очевидным выбором, но если вы действительно хотите просто отправить несколько файлов или папок и хотите что-то исключить, вы можете использовать оболочку с помощью перетаскивания scp. Сначала убедитесь, что в вашей оболочке установлены правильные параметры глобирования. Для bash run shopt -s extglobи для zsh используйте setopt ksh_glob. Тогда как то так:

scp /path/to/folder/!(tiny_mce|other_folder|*.bak) user@host:target_path

... скопировал бы все в исходной папке, кроме вещей, соответствующих данному шаблону. Очевидно, вы можете проявить творческий подход с этой частью.

Калеб
источник
7

rsync это хорошее решение, но если вы ищете альтернативу:

Допустим, у нас есть каталог «test», содержащий каталоги «foo, bar, baz». В этих каталогах есть куча разных типов файлов:

test
|____bar
| |____1.jpg
| |____1.png
| |____1.txt
| |____2.jpg
| |____2.png
| |____2.txt
|____baz
| |____1.avi
| |____2.avi
| |____3.png
|____foo
| |____test.blah
|____test.txt

Мы хотим скопировать все, кроме PNG

scp $(find /location/of/test -type f ! -name "*.png") # -> Note the logical NOT!!

В этом примере команда поместит все файлы в один и тот же каталог назначения - это может не соответствовать вашему желанию.

Энтон
источник
1
Обратите внимание, что этот ответ работает только в том случае, если соответствующие имена файлов и каталогов не содержат специальных символов оболочки (пробел или \[*?).
Жиль "ТАК - перестань быть злым"
3

Отличный инструмент, который вы можете попробовать, это "lftp".

lftp sftp://etc.etc/ 
lftp> ls 
    --- remote listing ---
lftp> mirror -R -n local/ remote/

Вы также можете использовать RSync поверх SSH

rsync -avzp -e ssh /this/dir/  remoteuser@remotehost:/remote/dir/

Должно сработать.

Кент Фредрик
источник
0

Я только что закончил писать, что предпочитаю Unison Rsync в любой день, так как

  • не нуждается в демоне, кроме ssh для транспорта
  • Позволяет мне в любое время изменять файлы с любой стороны - несколько мастеров , в то время как мне нужно всего лишь отправить запрос на синхронизацию с одной стороны.
  • Я сторонник модов, атрибутов / разрешений, программных ссылок и т. Д. С этим проблем нет; для одного проекта я даже использую 4 зеркала, одно из которых является хостом cygwin. Смотрите мой пример настройки crontab.
  • поддерживает исключения, как *.bak. Образцы в моем конфигурационном файле
Marcos
источник
0

Использование Secure Copy - scp

scp -r file user@host:

Чтобы скопировать много файлов

scp /directory/* user@host:destinationPath

Чтобы скопировать некоторые файлы

scp /directory/!(*.doc) user@host:destinationPath

Копирует содержимое каталога, кроме файлов .doc

Йогиш ХТ
источник
0

Я, безусловно, рекомендую вам rsync.

rsync -vra --exclude = "что вы хотите исключить" -e папка ssh user @ remotehost: / folder

Amit Singh
источник
0

Это то, что сработало для меня, когда я запустил его с сервера назначения.

rsync -av --progress user@servername:/sourcefolder /destinationfolder --exclude thefoldertoexclude
user2373210
источник
0

Мы можем сделать это в два этапа, чтобы игнорировать tiny_mceкаталог. Предполагая, что все каталоги начинаются со строчных букв.

scp -r USER@HOSTNAME:~/FOLDER/[a-s]* .
scp -r USER@HOSTNAME:~/FOLDER/[u-z]* .

Также измените USER, HOSTNAME и FOLDER на реальные значения.

Фади Ибрагим
источник