Интересное использование tar …, но что происходит?

Как правило, вы всегда хотите использовать CalendarView при просмотре встреч, потому что это расширяет повторяющиеся встречи. Вы не можете использовать фильтры с CalenderView, поэтому, хотя это может быть не так эффективно, как вам нравится, просто поиск и синхронизация за период времени, как правило, лучший подход и использование свойства GOID https://docs.microsoft.com/ en-us / office / client-developer / outlook / mapi / pidlidglobalobjectid-canonical-property в качестве идентификатора.

10
задан Federico A. Ramponi 25 November 2008 в 01:49
поделиться

11 ответов

На различии между CP и tar для копирования иерархий каталогов простой эксперимент может быть проведен для показа различия:

alastair box:~/hack/cptest [1134]% mkdir src
alastair box:~/hack/cptest [1135]% cd src
alastair box:~/hack/cptest/src [1136]% touch foo
alastair box:~/hack/cptest/src [1137]% ln -s foo foo-s
alastair box:~/hack/cptest/src [1138]% ln foo foo-h
alastair box:~/hack/cptest/src [1139]% ls -a
total 0
-rw-r--r--  2 alastair alastair    0 Nov 25 14:59 foo
-rw-r--r--  2 alastair alastair    0 Nov 25 14:59 foo-h
lrwxrwxrwx  1 alastair alastair    3 Nov 25 14:59 foo-s -> foo
alastair box:~/hack/cptest/src [1142]% mkdir ../cpdest
alastair box:~/hack/cptest/src [1143]% cp -rfp * ../cpdest
alastair box:~/hack/cptest/src [1144]% mkdir ../tardest
alastair box:~/hack/cptest/src [1145]% tar cf - * | (cd ../tardest ; tar xf - )
alastair box:~/hack/cptest/src [1146]% cd ..
alastair box:~/hack/cptest [1147]% ls -l cpdest
total 0
-rw-r--r--  1 alastair alastair    0 Nov 25 14:59 foo
-rw-r--r--  1 alastair alastair    0 Nov 25 14:59 foo-h
lrwxrwxrwx  1 alastair alastair    3 Nov 25 15:00 foo-s -> foo
alastair box:~/hack/cptest [1148]% ls -l tardest
total 0
-rw-r--r--  2 alastair alastair    0 Nov 25 14:59 foo
-rw-r--r--  2 alastair alastair    0 Nov 25 14:59 foo-h
lrwxrwxrwx  1 alastair alastair    3 Nov 25 15:00 foo-s -> foo

Различие находится в трудно связанных файлах. Заметьте, как трудно связанные файлы копируются индивидуально с cp и вместе с tar. Чтобы иметь более очевидное значение, взгляните на inodes для каждого:

alastair box:~/hack/cptest [1149]% ls -i cpdest
24690722 foo  24690723 foo-h  24690724 foo-s
alastair box:~/hack/cptest [1150]% ls -i tardest
24690801 foo  24690801 foo-h  24690802 foo-s

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

9
ответ дан 3 December 2019 в 14:35
поделиться

Это пишет архив в стандартный вывод, затем передает его по каналу к подпроцессу - перенесенный круглыми скобками - который изменяется на другой каталог и читает/извлекает из стандартного входа. Это что символ тире после f средства аргумента. Это в основном копирует все видимые файлы и подкаталоги текущего каталога к другому каталогу.

12
ответ дан 3 December 2019 в 14:35
поделиться

Это - уникальное использование каналов. В основном первый tar обычно пишет непосредственно в файл, но вместо этого он собирается записать в stdout (-), который затем перенаправляется к другому tar, который берет stdin, а не файл. В основном это - то же самое как смолящий в файл и не смолящий позже, кроме без промежуточного файла.

2
ответ дан 3 December 2019 в 14:35
поделиться

Для каталога с 25 000 пустых файлов:

$ time { tar -cf - * | (cd ../bar; tar -xf - ); }
real    0m4.209s
user    0m0.724s
sys 0m3.380s

$ time { cp * ../baz/; }
real    0m18.727s
user    0m0.644s
sys 0m7.127s

Для каталога с 4 файлами 1 073 741 824 байтов (1 ГБ) каждый

$ time { tar -cf - * | (cd ../bar; tar -xf - ); }
real    3m44.007s
user    0m3.390s
sys 0m25.644s

$ time { cp * ../baz/; }
real    3m11.197s
user    0m0.023s
sys 0m9.576s

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

(Я запустил вышеупомянутые тесты на HFS +.)

5
ответ дан 3 December 2019 в 14:35
поделиться
tar cf - * | (cd <dest> ; tar xf - )

движение должно смолить все не скрытые файлы/каталоги текущего каталога к stdout, затем передавая это по каналу в stdin новых подоболочек. Та оболочка сначала изменяет текущий рабочий каталог на <dest>, и затем не смолит его к тому каталогу.

1
ответ дан 3 December 2019 в 14:35
поделиться
tar cf - *

Это использует tar для отправки * к stdout

|

Это делает очевидное перенаправление stdout к...

(cd <dest> ; tar xf - )

Это, которое изменяет PWD на соответствующее местоположение и затем извлекает из stdin

Я не знаю, почему это было бы быстрее, чем rsync, поскольку нет никакого включенного сжатия.

0
ответ дан 3 December 2019 в 14:35
поделиться

Некоторые старые версии CP не имели-f/-p (и подобный) опции для сохранения полномочий, таким образом, этот прием tar сделал задание.

1
ответ дан 3 December 2019 в 14:35
поделиться

Решение для tar сохранит символьные ссылки, тогда как CP просто сделает копии и уничтожит ссылки.

tar был стандартной утилитой Unix намного дольше, чем rsync. Вы, более вероятно, найдете его в ситуации, когда иерархия каталогов должна будет быть скопирована в другое местоположение (даже другой компьютер). rsync, вероятно, легче использовать эти дни, но медленнее, потому что он сравнивает и источник и места назначения и синхронизация их. tar просто копирует в одном направлении.

0
ответ дан 3 December 2019 в 14:35
поделиться

Если у Вас есть GNU cp (который все основанные на Linux системы будут), cp --archive будет работать, даже на трудно связанных файлах, и tar не нужен.

0
ответ дан 3 December 2019 в 14:35
поделиться

Как это происходит, коллега записал почти идентичную команду в один из наших сценариев. После того, как я провел некоторое время, ломающее голову над ним, я спросил, почему он использовал это, а не cp. Его ответ, поскольку я вспоминаю это, был этим cp является медленным при создании копии от одной файловой системы до другого.

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

С другой стороны, современные операционные системы делают довольно хорошее задание предварительного кэширования операций IO. Это совершенно возможно cp проведет большую часть его времени, ожидая на записях и получая чтения из памяти, а не само устройство. Кажется, что можно было бы быть нужны действительно твердые данные к, выбрал использование два tar команды, а не более простое cp команда.

0
ответ дан 3 December 2019 в 14:35
поделиться

Я считаю, что tar выполнит операцию «слияния» в стиле Windows с глубоко вложенными каталогами, тогда как cp перезапишет подкаталоги.

Например, если у вас есть макет:

dir/subdir/file1

и вы копируете его в место назначения, которое содержит:

dir/subdir/file2

Затем с копией у вас останется:

dir/subdir/file1

Но с командой tar ваш пункт назначения будет содержать:

dir/subdir/file1
dir/subdir/file2
1
ответ дан 3 December 2019 в 14:35
поделиться
Другие вопросы по тегам:

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