Это встречает порядок Вашего желаемого вывода:
$ 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"
Можно передать --remove-source-files
к rsync для перемещения файлов вместо того, чтобы копировать их.
Но в Вашем случае, нет никакого смысла в использовании rsync, так как место назначения пусто. Плоскость mv
сделает задание максимально быстро.
В Вашем случае, что могло иметь значение к производительности, выбор сетевого протокола, если у Вас есть выбор среди NFS, Samba, sshfs, sftp, rsync по ssh, tar, переданный по каналу в ssh, и т.д. Относительная скорость этих методов зависит от размеров файла, сети и дисковой пропускной способности и других факторов, таким образом, нет никакого способа дать общие рекомендации, необходимо будет выполнить собственные сравнительные тесты.
В целом, поскольку Gilles сказал, что нет никакого преимущества для использования rsync
перемещать файлы когда mv
получит то же задание, сделанное более простой и между обычными файловыми системами нет никакого потенциального выигрыша в быстродействии.
Существуют однако несколько раз, когда существует преимущество. В частности, если у Вас есть какие-либо сомнения относительно устойчивости или источника, места назначения или машины, делающей работу, с помощью rsync
дает Вам способность к резюме. Это может быть известным преимуществом, если Вы передаете, является очень большим, и, скажем, Ваша электросеть ненадежна. Используя rsync будет более стабильный способ избежать повреждения данных в случае отказа и погрузки, где Вы кончили.
Было бы любое преимущество использовать rsync для перемещения содержимого папки A, чтобы сказать, папку B, с B пустой?
Я оказался в ситуации где rsync быстрее, чем mv, просто потому, что MV не может обрабатывать количество файлов в каталоге. У меня есть 1,8 миллиона фотографий с камеры безопасности, которая управляла в течение 20 дней, и команда MV выходит с ошибкой, потому что он не может выделить ресурсы.
rsync Однако, кажется, обрабатывает все файлы без проблем.
Поскольку - 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
, чтобы пустые деревья каталогов удалялись снизу вверх.
Нет способа перемещать файлы с помощью rsync, как это делает команда Linux mv. Используя --удалить -исходные -файлы, вы, по сути, копируете файлы в место назначения, а затем удаляете файлы (, за исключением каталогов ), из источника. Это может достичь вашей цели по перемещению файлов, но вы НЕ сэкономите время или операции ввода-вывода.
Я написал сценарий 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=progress2
Rsync показывает статистику по всей передаче, а не по отдельным файлам. Команда сценария find
удаляет только пустые каталоги. Как уже упоминалось , возможность возобновления Rsync делает его более стабильным способом перемещения файлов.
Чтобы псевдоним скрипта был mv, добавьте следующие строки в ваш.bashrc
:
alias mv='~/ComputerScience/SoftwareDevelopment/MySoftware/Bash/mvRsync.sh'
alias sudo="sudo "
Замените мой конкретный путь в первой строке выше на тот, который вы выбрали. Псевдоним sudo необходим , если вы планируете использовать псевдоним с sudo.
Недостатки этого скрипта:
tab
, как в случае с командой mv
. Эту проблему можно решить, переписав этот скрипт так, чтобы он принимал аргументы CLI, а не вводимые пользователем данные с помощью read
.
--remove-source-files
только удаляет файлы в источнике. если Вы хотите очистить наш источник, не был бы, необходимо сделать комнату-rf (илиfind
все каталоги и передача-delete
) на источнике после того, как rsync работает успешно? – Trevor Boyd Smith 29.11.2016, 15:51