LINUX.ORG.RU

Однострочник копирование (варианты)

 


0

4

Какой из этих однострочников для копирования из каталога в каталог более верный?

for fl in dir1/*; do cp -R "$fl" dir2; done
find dir1 -true | while read fl; do cp "$fl" dir2; done
find dir1 -true -exec cp '{}' dir2 \;
find dir1 -type f -exec cp '{}' dir2 \;

★★★★★

Аксиома Эскобара.
Для копирования всего copy -R, для копирования отдельных выборочных каталогов/файлов а-ля {dir1, dir2, file, exp*} – zsh.

znenyegvkby ()
Ответ на: комментарий от stalkerhouse

А, ладно, извини, это мне показалось. Звёздочка в шелле не учитывает файлы начинающиеся с точки, это надо *. дополнительно писать в условии.

anonymous ()
Ответ на: комментарий от anonymous

Поискал в инете, почему-то везде описаны варианты с "-type f", а не с "-true"

sunny1983 ★★★★★ ()
Ответ на: комментарий от sunny1983
- dir1/*
+ dir1/* dir1/.[^.]* dir1/..?*

Обычные файлы, файлы, начинающиеся с точки (но не каталог уровнем выше ..) и файлы, начинающиеся с .., но не каталог ..

gag ★★★★★ ()

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

targitaj ★★★★★ ()
Ответ на: комментарий от Zmicier

Это интересный ньюанс, потому что я как раз обычно цикл использую для обхода Argument list too long
Реквестирую объяснение экспертов

zolden ★★★★★ ()
Ответ на: комментарий от Zmicier

Не понял, for, while и find вообще не нужны что ли? Сталкивался с ситуациями, когда звёздочка не работает, а однострочник работает, не помню что за ситуации, как воспроизведу - напишу.

sunny1983 ★★★★★ ()
Ответ на: комментарий от sunny1983

Как надо видоизменить, чтобы копировались в том числе и файлы, начинающиеся с точки?

cp -R dir1/{,.}* dir2/

yumko ★★ ()
Ответ на: комментарий от sunny1983

for, while и find вообще не нужны что ли?

В каком смысле? for и while — это циклы в Баше, find — отдельная программа для поиска файлов.

сталкивался с ситуациями, когда звёздочка не работает

Звездочка в Баше всегда работает, это Линукс® не всегда способен переварить слишком длинный перечень аргументов к cp или любой другой программе. В этом случае совсем уж целесообразно бить аргументы на группы по примерно ARG_MAX штук, но с этим никто не заморачивается, а вместо этого запускает по процессу на каждый файл.

Zmicier ★★★★★ ()
Ответ на: комментарий от Zmicier

Нашёл ситуацию когда звёздочка не работает - когда имена файлов должны присутствовать одновременно и в аргументе1, и в аргументе2:

dir="$PWD" && cd /usr/share/phpMyAdmin && for fl in *; do ln -sf /usr/share/phpMyAdmin/"$fl" /var/www/html/phpMyAdmin/"$fl"; done && cd "$dir"
Как такой однострочник переделать чтобы обрабатывались файлы, начинающиеся с точки?

sunny1983 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.