скопировать самые маленькие файлы сначала?

Принятие Вас означает, что целый второй элемент является тем же в каждом случае, можно использовать его в качестве ключа в ассоциативном массиве. Вот awk пример, который полагается на это:

awk '
/^EN/ {
  if(H[$2] == "")
    H[$2] = $1
  else
    H[$2] = H[$2]","$1
}
END {
  for(key in H)
    print key, H[key]
}' infile

Вывод:

Nucus_2158_mri_4/2_Co_1.0_Le_3104 EN2
Nucus_2159_mri_1/2_Co_1.0_Le_3104 EN6
Nucus_2158_mri_1/2_Co_1.0_Le_3104 EN1,EN3,EN5
Nucus_2158_mri_1/2_Co_1.0_Le_3106 EN4
15
09.04.2014, 02:27
5 ответов
[1129224] Это делает всю работу за один проход - во всех дочерних каталогах, все в одном потоке без проблем с именами файлов. Он будет копировать от самого маленького до самого большого файла, который у вас есть. Вам понадобится [1129562]mkdir ${DESTINATION}[1129563], если его еще нет.

Знаете что? Чего это не делает, так это [1129564]пустые[1129565] дочерние каталоги. Я мог бы сделать переадресацию через этот конвейер, но это просто гоночное состояние, ожидающее своего часа. Проще всего, наверное, лучше. Так что просто сделайте это после:

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

Я все равно готов поспорить, что это быстрее, чем [1129566]mkdir[1129567]. [1129231]

10
27.01.2020, 19:49
[1129210]Вот быстрый и грязный метод с использованием [1129554]rsync[1129555]. Для данного примера я считаю "малым" все, что меньше 10 Мб.

Сначала передайте только маленькие файлы:

rsync -a --max-size=10m srcdir dstdir

Затем передайте оставшиеся файлы. Переданные ранее небольшие файлы не будут перекопированы, если они не были изменены.rsync -a srcdir dstdir

From [1129560]man 1 rsync

Microsoft Exchange Server 2000:         6.0.4417 or higher
Microsoft Exchange Server 2000 SP1:     6.0.4712 or higher
Microsoft Exchange Server 2000 SP2:     6.0.5762 or higher
Microsoft Exchange Server 2000 SP3:     6.0.6249 or higher
Microsoft Exchange Server 2003:         6.5.6944 or higher
Microsoft Exchange Server 2003 SP1:     6.5.7226 or higher
Microsoft Exchange Server 2003 SP2:     6.5.7638 or higher
Microsoft Exchange Server 2007:         8.0.685.24 or higher

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

15
27.01.2020, 19:49
[1129232] другим вариантом было бы использование cp с выводом du:

Это все еще можно было бы сделать на одной строке, но я разделил ее так, чтобы вы могли прочитать ее[1129235].

1
27.01.2020, 19:49
[1129362] Не [1129716]cp [1129717] напрямую, это далеко за пределами его возможностей. Но можно организовать вызов [1129718]cp[1129719] по файлам в правильном порядке.[12110]Zsh удобно позволяет сортировать файлы по размеру с помощью [1129720]глобусного классификатора[1129721]. Вот фрагмент zsh, который копирует файлы в порядке возрастания их размера из-под [1129722]/пути/к/директории источника[1129723] в-под [1129724]/пути/к/директории назначения[1129725].[12111]Вместо цикла можно использовать функцию [12112]zcp[12113]. Однако, сначала необходимо создать каталоги назначения, что можно сделать в зашифрованном oneliner[12114]Это не сохраняет права собственности на каталоги-источники. Если вы хотите этого, то вам нужно найти подходящую программу для копирования, такую как [1129728]cpio[1129729] или [1129730]pax[1129731]. Если вы это сделаете, то вам не нужно будет дополнительно вызывать [1129732]cp[1129733] или [1129734]zcp[1129735].[12115]
4
27.01.2020, 19:49
[1129206] Я не думаю, что есть какой-то способ заставить [1129538]cp -r [1129539] сделать это напрямую. Так как это может быть неопределенный период времени, прежде чем вы получите волшебное решение [1129540] найти [1129541]/[1129542]awk[1129543], вот быстрый perl скрипт:

Используйте это: [1129974]./weverever.pl /src/path /dest/path

Аргументами должны быть как [1129976]абсолютные пути[1129977]; [1129978]~[1129979], так и что-либо еще, что оболочка расширяется до абсолютного пути.

date_subs=0
max_text=1000
perpage=25
stop_cmd=/etc/init.d/bitnami stop mysql >/dev/null 2>&1
mysqldump=/opt/bitnami/mysql/bin/mysqldump
nodbi=0
mysql_libs=/opt/bitnami/mysql/lib
max_dbs=50
start_cmd=/etc/init.d/bitnami start mysql >/dev/null 2>&1 &
mysql_data=/var/lib/mysql
mysqlimport=/opt/bitnami/mysql/bin/mysqlimport
access=*: *
style=0
my_cnf=/opt/bitnami/mysql/my.cnf
mysqlshow=/opt/bitnami/mysql/bin/mysqlshow
mysql=/opt/bitnami/mysql/bin/mysql
nopwd=0
add_mode=1
passwd_mode=0
blob_mode=0
mysqladmin=/opt/bitnami/mysql/bin/mysqladmin

Если вы добавите третий аргумент (что угодно, кроме буквального [1129980]0[1129981]), то вместо копирования он будет выводить стандартный отчет о том, что бы он делал, с предварением размеров файлов в байтах, например,

link_dir=/opt/bitnami/apache2/conf/sites-enabled
test_manual=0
show_list=0
mime_types=/opt/bitnami/apache2/conf/mime.types
access_conf=/opt/bitnami/apache2/conf/access.conf
auto_mods=1
stop_cmd=/etc/init.d/bitnami stop apache
virt_file=/opt/bitnami/apache2/conf/sites-available
test_apachectl=1
max_servers=100
srm_conf=/opt/bitnami/apache2/conf/srm.conf
httpd_dir=/opt/bitnami/apache2
start_cmd=/etc/init.d/bitnami start apache
show_order=0
test_always=0
httpd_conf=/opt/bitnami/apache2/conf/httpd.conf
defines_file=/opt/bitnami/apache2/bin/envvars
apachectl_path=/opt/bitnami/apache2/bin/apachectl
show_names=0
test_config=1
apply_cmd=/opt/bitnami/bin/apachectl graceful
httpd_path=/opt/bitnami/apache2/bin/httpd

4523 /src/path/file.x -> /dest/path/file.x. 12124 /src/path/file.z -> /dest/path/file.z

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

  1. Команда [1129984]cp[1129985] на строке 34 - это буквальная команда оболочки, так что вы можете делать все, что захотите, с помощью переключателей (я только что использовал [1129986]-a[1129987] для сохранения всех признаков).

File::Find[1129989] и [1129990]File::Basename[1129991] оба являются модулями ядра, т.е. они доступны во всех инсталляциях perl.

2
27.01.2020, 19:49

Теги

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