Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание нескольких копий одного файла 
:(
    Опции темы
UserNet
Дата 24.10.2008, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 13.12.2006
Где: Новосибирск

Репутация: 1
Всего: 3



Как можно создать несколько копий одного файла, кроме как конвеер копирований?
PM MAIL   Вверх
powerfox
Дата 24.10.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(UserNet @  24.10.2008,  09:15 Найти цитируемый пост)
Как можно создать несколько копий одного файла, кроме как конвеер копирований? 

Вывод скрипта? Копии или ссылки?
Посмотрите tee.


--------------------
user posted image
PM WWW   Вверх
UserNet
Дата 24.10.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 13.12.2006
Где: Новосибирск

Репутация: 1
Всего: 3



Не ссылки именно, копии. Что-то с tee не получается. Я пробовал cat 1.txt >2.txt>3.txt
но получается что файл 2.txt пустой.

Это сообщение отредактировал(а) UserNet - 24.10.2008, 13:04
PM MAIL   Вверх
powerfox
Дата 24.10.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



UserNet, 
Код

fox@linux-pe9x:~> echo qweqweqeqweqwe > origin
fox@linux-pe9x:~> cat origin | tee 1.txt 2.txt 3.txt
qweqweqeqweqwe
fox@linux-pe9x:~> cat ?.txt
qweqweqeqweqwe
qweqweqeqweqwe
qweqweqeqweqwe
fox@linux-pe9x:~>  



--------------------
user posted image
PM WWW   Вверх
inside_pointer
Дата 27.10.2008, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 8
Всего: 12



Код

[guest@localhost tmp]$ ls
1  code  downloads  music  save  test.c
[guest@localhost tmp]$ for i in 1 2 3; do cp test.c test$i.c; done;
[guest@localhost tmp]$ ls
1  code  downloads  music  save  test1.c  test2.c  test3.c  test.c

PM MAIL   Вверх
powerfox
Дата 27.10.2008, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(inside_pointer @  27.10.2008,  02:05 Найти цитируемый пост)
[guest@localhost tmp]$ for i in 1 2 3; do cp test.c test$i.c; done;

tee эффективнее: в данном случае test.c будет считан 3 раза. Если же речь идёт о выводе программы, то tee подхватывает её вывод (наверное, почти эквивалентно 1 чтению) и пишет в N файлов. Если речь идёт об очень большом выводе (/var/log/messages), то разница будет значительна.


--------------------
user posted image
PM WWW   Вверх
inside_pointer
Дата 27.10.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 8
Всего: 12



Код

[guest@localhost tmp]$ ls -l
итого 17392
drwxrwxr-x  2 guest guest     4096 Окт 12 18:29 1
drwxrwxr-x  5 guest guest     4096 Окт 19 12:15 code
drwxrwxr-x  4 guest guest     4096 Окт 18 21:48 downloads
-rw-r--r--  1 guest guest 17728437 Окт 27 18:05 file.txt
drwxrwxr-x  9 guest guest     4096 Окт 13 23:30 music
drwxrwxr-x 12 guest guest     4096 Окт 13 12:58 save
-rw-rw-r--  1 guest guest     1291 Окт 26 06:33 test.c

[guest@localhost tmp]$ cat file.txt | tee f1 f2 f3 >/dev/null
[guest@localhost tmp]$ rm -f f1 f2 f3
[guest@localhost tmp]$ for I in 1 2 3; do cp -f file.txt f$I; done
[guest@localhost tmp]$ rm -f f1 f2 f3

проверил на 17 метрах одна и та же скорость

Цитата

то tee подхватывает её вывод

у tee нужно вывод прятать иначе с выводом эти 17 метров записываются около 7 секунд
цикл гибче, т.к. предоставляет средства для имён новых файлов шире чем tee сможет получить, т.к. tee опирается на шаблоны bash а их не так много
tee один раз исходный файл открывает но копирует каждый символ из него столько же раз сколько cp
PM MAIL   Вверх
powerfox
Дата 27.10.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(inside_pointer @  27.10.2008,  12:23 Найти цитируемый пост)
tee один раз исходный файл открывает но копирует каждый символ из него столько же раз сколько cp 

Я совсем мельком посмотрел на исходники: не похоже, чтобы исходные символы читались N раз. 1 раз чтение, N раз запись.

Цитата(inside_pointer @  27.10.2008,  12:23 Найти цитируемый пост)
проверил на 17 метрах одна и та же скорость

Лучше использовать time для проверок.

Код

linux-pe9x:/var/log # du -sh zypp-refresh.log
31M     zypp-refresh.log
linux-pe9x:/var/log # time (< zypp-refresh.log tee {1..9}.txt > /dev/null)

real    0m9.371s
user    0m0.012s
sys     0m0.916s
linux-pe9x:/var/log # time for i in {1..9}; do cp zypp-refresh.log $i.txt;done

real    0m9.437s
user    0m0.020s
sys     0m0.992s


tee чуть быстрее (правда, в основном лишь по системному и пользовательскому времени, реальное колеблется). Разница будет значительной если речь идёт не просто о копировании файла, а именно о выводе (логов, например) долго работающей программы.

Цитата(powerfox @  24.10.2008,  13:27 Найти цитируемый пост)
Вывод скрипта? Копии или ссылки?

Автор темы не ответил, что именно ему надо.

Цитата(inside_pointer @  27.10.2008,  12:23 Найти цитируемый пост)
цикл гибче, т.к. предоставляет средства для имён новых файлов шире чем tee сможет получить, т.к. tee опирается на шаблоны bash а их не так много

А for не на шаблоны bash'a опирается?
Код

tee {1..3}.txt


Это сообщение отредактировал(а) powerfox - 27.10.2008, 16:52


--------------------
user posted image
PM WWW   Вверх
inside_pointer
Дата 28.10.2008, 03:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 8
Всего: 12



проверил и на 200M файле скорость одна и та же
система толи кэширует там чо-то толи что, иногда копирует одно и то же разное количество времени, но вот то что на 200 метрах разница незаметна, а у tee надо ещё и вывод подавлять for удобнее для этой задачи

Цитата

А for не на шаблоны bash'a опирается?


Код

[guest@localhost tmp]$ ls
1  code  downloads  music  save  test.c
[guest@localhost tmp]$ for I in $(echo one two three four five six seven); do cp test.c test_$I.c; done;
[guest@localhost tmp]$ ll
итого 104
drwxrwxr-x  2 guest guest 4096 Окт 12 18:29 1
drwxrwxr-x  5 guest guest 4096 Окт 19 12:15 code
drwxrwxr-x  4 guest guest 4096 Окт 18 21:48 downloads
drwxrwxr-x  9 guest guest 4096 Окт 13 23:30 music
drwxrwxr-x 12 guest guest 4096 Окт 13 12:58 save
-rw-rw-r--  1 guest guest 1291 Окт 26 06:33 test.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_five.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_four.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_one.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_seven.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_six.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_three.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_two.c
[guest@localhost tmp]$ rm test_*
[guest@localhost tmp]$ echo hello, i\'m a good filenames text file > names
[guest@localhost tmp]$ ls
1  code  downloads  music  names  save  test.c
[guest@localhost tmp]$ for I in $(cat names); do cp test.c test_$I.c; done;
[guest@localhost tmp]$ ll
итого 112
drwxrwxr-x  2 guest guest 4096 Окт 12 18:29 1
drwxrwxr-x  5 guest guest 4096 Окт 19 12:15 code
drwxrwxr-x  4 guest guest 4096 Окт 18 21:48 downloads
drwxrwxr-x  9 guest guest 4096 Окт 13 23:30 music
-rw-rw-r--  1 guest guest   38 Окт 28 10:45 names
drwxrwxr-x 12 guest guest 4096 Окт 13 12:58 save
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_a.c
-rw-rw-r--  1 guest guest 1291 Окт 26 06:33 test.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_file.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_filenames.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_good.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_hello,.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_i'm.c
-rw-rw-r--  1 guest guest 1291 Окт 28 10:45 test_text.c
[guest@localhost tmp]$ rm test_*
[guest@localhost tmp]$


и на шаблоны
в качестве списка можно установить свою функцию, которая такой вывод даст, что файлы можно переименовывать тоннами и всё будет правильно и под контролем

Это сообщение отредактировал(а) inside_pointer - 28.10.2008, 03:48
PM MAIL   Вверх
powerfox
Дата 28.10.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(inside_pointer @  28.10.2008,  04:45 Найти цитируемый пост)
и на шаблоны
в качестве списка можно установить свою функцию, которая такой вывод даст, что файлы можно переименовывать тоннами и всё будет правильно и под контролем

То же самое и в tee... И то, и то сидит поверх оболочки и может использовать её функционал.

Цитата(inside_pointer @  28.10.2008,  04:45 Найти цитируемый пост)
у tee надо ещё и вывод подавлять for удобнее для этой задачи

Повторюсь, что если речь идёт о копировании логов на лету (то есть программа долго работает и ругается в лог), то tee закончит выполнение одновременно с программой (а цикл нужно запускать отдельно после выполнения).


--------------------
user posted image
PM WWW   Вверх
inside_pointer
Дата 29.10.2008, 03:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 8
Всего: 12



Код

[guest@localhost tmp]$ ls
1  code  downloads  file.txt  music  save
[guest@localhost tmp]$ for I in $(echo _one_$(Time); sleep 3; echo _two_$(Time)); do cp file.txt file$I.txt; done;
[guest@localhost tmp]$ ll
итого 64
drwxrwxr-x  2 guest guest 4096 Окт 12 18:29 1
drwxrwxr-x  5 guest guest 4096 Окт 19 12:15 code
drwxrwxr-x  4 guest guest 4096 Окт 18 21:48 downloads
-rw-rw-r--  1 guest guest    4 Окт 29 09:25 file_one_09:25:45.txt
-rw-rw-r--  1 guest guest    4 Окт 29 09:25 file_two_09:25:48.txt
-rw-rw-r--  1 guest guest    4 Окт 29 09:11 file.txt
drwxrwxr-x  9 guest guest 4096 Окт 13 23:30 music
drwxrwxr-x 12 guest guest 4096 Окт 13 12:58 save
[guest@localhost tmp]$ rm file_*
[guest@localhost tmp]$ ls
1  code  downloads  file.txt  music  save
[guest@localhost tmp]$


в tee так не сделаешь

Цитата

то tee закончит выполнение одновременно с программой (а цикл нужно запускать отдельно после выполнения).


она наверное считывает символы в буфер, а потом с него читает три раза и записывает три раза, потому скорость такая
даже 4, т.к. ещё stdout
но вот к первоначальному вопросу как размножить файл for подходит больше чем tee, т.к. он гибче просто, мало того for встроенная конструкция а tee программа, конечно cp тоже программа но она не выводит на stdout (что надо при размножении файлов реже 50%) а ещё она может плодить каталоги, в отличии от tee (а я думаю автору интересно и это), и при желании в for'е можно использовать tee, когда нужно, а ещё можно использовать сторонние программы, которые могут предоставлять больше возможностей чем у стандартной tee (то есть и её возможности и ещё какие-нибудь)
тут плюсы очевидны, зачем зависеть от tee
PM MAIL   Вверх
powerfox
Дата 29.10.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(inside_pointer @  29.10.2008,  04:06 Найти цитируемый пост)
[guest@localhost tmp]$ for I in $(echo _one_$(Time); sleep 3; echo _two_$(Time)); do cp file.txt file$I.txt; done;


Цитата(inside_pointer @  29.10.2008,  04:06 Найти цитируемый пост)
но вот к первоначальному вопросу как размножить файл for подходит больше чем tee, т.к. он гибче просто, мало того for встроенная конструкция а tee программа, конечно cp тоже программа но она не выводит на stdout (что надо при размножении файлов реже 50%) а ещё она может плодить каталоги, в отличии от tee (а я думаю автору интересно и это), и при желании в for'е можно использовать tee, когда нужно, а ещё можно использовать сторонние программы, которые могут предоставлять больше возможностей чем у стандартной tee (то есть и её возможности и ещё какие-нибудь)
тут плюсы очевидны, зачем зависеть от tee 

Убедил smile


--------------------
user posted image
PM WWW   Вверх
inside_pointer
Дата 30.10.2008, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 8
Всего: 12



нашёл прикольную особенность у tee

Код

[guest@localhost tmp]$ echo a >file.txt
[guest@localhost tmp]$ cat file.txt | tee - - - - -
a
a
a
a
a
a
[guest@localhost tmp]$ echo -n a 1>file.txt
[guest@localhost tmp]$ cat file.txt | tee - - - - -
aaaaaa[guest@localhost tmp]$


видишь если бы можно было вывод подавлять попроще чем >/dev/null делать, я бы чаще её юзал, однако из-за этого она подходит к специфическим задачам типа просмотра логов, и для повседневной работы ... (это встраивать алиас с убиранием вывода на экран), а если писать свою копию tee, так её не будет на любом линуксе даже который тот же самый но установленный с нуля (т.е. её надо где-то хранить и ставить каждый раз)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Oбщие вопросы"
nickless
Imple
nerezus

В тему здесь вопросы общие - не привязанные к определенному ПО или дистрибутиву BSD/Linux/UNIX.
Например вопросы о выборе ОС для определенных задач (но если Вы просто хотите узнать "Какой дистрибутив лучше", то для этого есть Клуб юнуксоидов).
Общие вопросы по shell-программированию тоже лучше задавать здесь.


  • Вопросы мобильной разработки тут
  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | *NIX системы: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.