Используя rsync для перемещения (не копируют), файлы между каталогами?

Это встречает порядок Вашего желаемого вывода:

$ awk -F, '
    NR == FNR {field1[$0] = $1; next}
    {
      for (line in field1) 
        if (line ~ $0) 
          print field1[line]
    }
  ' data.csv list.txt 
"The Mike"
"John"
"Johnny"
"Lizard"
"Johnny"

Это читает data.csv файл в память, отображая целую строку на field1. Затем каждая строка файла list.txt проверяется по каждому элементу массива field1.

Если бы файл данных намного больше, чем файл списка, то имело бы больше смысла содержать меньший файл в памяти и цикле по большему файлу строка за один раз:

$ awk -F, '
    NR == FNR {list[$1]; next}
    {
      for (item in list) 
        if ($0 ~ item) 
          print $1
    }
  ' list.txt data.csv 
"John"
"The Mike"
"Lizard"
"Johnny"
"Johnny"
58
30.07.2012, 00:21
6 ответов

Можно передать --remove-source-files к rsync для перемещения файлов вместо того, чтобы копировать их.

Но в Вашем случае, нет никакого смысла в использовании rsync, так как место назначения пусто. Плоскость mv сделает задание максимально быстро.

В Вашем случае, что могло иметь значение к производительности, выбор сетевого протокола, если у Вас есть выбор среди NFS, Samba, sshfs, sftp, rsync по ssh, tar, переданный по каналу в ssh, и т.д. Относительная скорость этих методов зависит от размеров файла, сети и дисковой пропускной способности и других факторов, таким образом, нет никакого способа дать общие рекомендации, необходимо будет выполнить собственные сравнительные тесты.

72
27.01.2020, 19:32
  • 1
    Только для повторения то, что говорит Caleb, если Вы волнуетесь по поводу повреждения из-за, например, облупленная сеть, rsync может иметь смысл, поскольку это проверяет каждый файл, который это пишет вычислением контрольной суммы блокам, как это пишет им. –  Daniel S. Sterling 01.12.2015, 23:31
  • 2
    обратной косой черты --remove-source-files только удаляет файлы в источнике. если Вы хотите очистить наш источник, не был бы, необходимо сделать комнату-rf (или find все каталоги и передача -delete) на источнике после того, как rsync работает успешно? –  Trevor Boyd Smith 29.11.2016, 15:51

В целом, поскольку Gilles сказал, что нет никакого преимущества для использования rsync перемещать файлы когда mv получит то же задание, сделанное более простой и между обычными файловыми системами нет никакого потенциального выигрыша в быстродействии.

Существуют однако несколько раз, когда существует преимущество. В частности, если у Вас есть какие-либо сомнения относительно устойчивости или источника, места назначения или машины, делающей работу, с помощью rsync дает Вам способность к резюме. Это может быть известным преимуществом, если Вы передаете, является очень большим, и, скажем, Ваша электросеть ненадежна. Используя rsync будет более стабильный способ избежать повреждения данных в случае отказа и погрузки, где Вы кончили.

17
27.01.2020, 19:32

Было бы любое преимущество использовать rsync для перемещения содержимого папки A, чтобы сказать, папку B, с B пустой?

Я оказался в ситуации где rsync быстрее, чем mv, просто потому, что MV не может обрабатывать количество файлов в каталоге. У меня есть 1,8 миллиона фотографий с камеры безопасности, которая управляла в течение 20 дней, и команда MV выходит с ошибкой, потому что он не может выделить ресурсы.

rsync Однако, кажется, обрабатывает все файлы без проблем.

16
27.01.2020, 19:32

Поскольку - remove-source-files не удаляет каталоги, я выполняю следующие команды для move файлы через ssh:

rsync -avh --progress --remove-source-files /source/* user@server:/target \
&&  find /source -type d -empty -delete

Мне лично нравится функция - progress , так как я делаю эту передачу вручную. Удалите его, если вы используете скрипт. Я ожидаю, что это немного замедлит передачу. Параметр удаления команды find удаляет только пустые каталоги - не используйте rm -rf , поскольку он может удалить непустые каталоги в случае, если файл не был передан. Параметр -delete включает параметр -depth , чтобы пустые деревья каталогов удалялись снизу вверх.

21
27.01.2020, 19:32

Нет способа перемещать файлы с помощью rsync, как это делает команда Linux mv. Используя --удалить -исходные -файлы, вы, по сути, копируете файлы в место назначения, а затем удаляете файлы (, за исключением каталогов ), из источника. Это может достичь вашей цели по перемещению файлов, но вы НЕ сэкономите время или операции ввода-вывода.

0
27.01.2020, 19:32

Я написал сценарий Bash, реализующийrsync-основанныйmv:

#!/usr/bin/bash

echo -e "Would you like to use a relative path to your source?[y/n?]\n"

read ans

if [[ $ans == y ]]; then

    echo -e "Relative source?\n"

    read source

    source="`pwd`/$source"

elif [[ $ans == n ]]; then

    echo -e "Absolute path to your source?\n"

    read source
    
    source=${source/"~/"/"/home/jerzy/"}

    
else

    echo -e "Use small cap 'y' or 'n' only."
    
    exit 

fi


echo -e "Would you like to use a relative path to your destination?[y/n?]\n"

read ans2

if [[ $ans2 == y ]]; then

    echo -e "Relative destination?\n"

    read dest

    dest="`pwd`/$dest"
    
    dest=${dest/"~/"/"/home/jerzy/"}
    

elif [[ $ans2 == n ]]; then

    echo -e "Absolute path to your destination?\n"

    read dest
    
    dest=${dest/"~/"/"/home/jerzy/"}


else

    echo -e "Use small cap 'y' or 'n' only."
    
    exit 

fi

rsync -avh --remove-source-files --info=progress2 ${source} ${dest} && find ${source} -type d -empty -delete

Параметр--info=progress2Rsync показывает статистику по всей передаче, а не по отдельным файлам. Команда сценария findудаляет только пустые каталоги. Как уже упоминалось , возможность возобновления Rsync делает его более стабильным способом перемещения файлов.

Чтобы псевдоним скрипта был mv, добавьте следующие строки в ваш.bashrc:

alias mv='~/ComputerScience/SoftwareDevelopment/MySoftware/Bash/mvRsync.sh'
alias sudo="sudo "

Замените мой конкретный путь в первой строке выше на тот, который вы выбрали. Псевдоним sudo необходим , если вы планируете использовать псевдоним с sudo.

Недостатки этого скрипта:

  • Нет завершения путей с помощью клавиши tab, как в случае с командой mv. Эту проблему можно решить, переписав этот скрипт так, чтобы он принимал аргументы CLI, а не вводимые пользователем данные с помощью read.
1
12.03.2021, 18:20

Теги

Похожие вопросы