SLEDopit писал(а): ↑13.04.2012 16:44
Так в том то и разница, что при mv данные не перемещаются, а при cp && rm - перемещаются (напомню, что речь идёт про действия внутри одной файловой системы). Поэтому принципиальная разница таки есть.
вопрос в том,
что считать данными? Вот вы содержимое каталога данными считаете? А я - считаю. И если внимательно исследовать работу mv, то она чётко распадается на два действия:
1. данные файла (имя и inode)
копируются из одного каталога в другой, а точнее - записываются в хвост каталога-приёмника.
2. данные файла удаляются из каталога-источника.
Вполне возможно выполнить только первый пункт, т.е. mv без удаления: для этого служит команда
ln. Она создаёт точную копию
имени файла (хардлинк). На практике конечно ln+rm не совсем совпадает с mv, но в принципе они эквивалентны.
sgfault писал(а): ↑13.04.2012 23:35
А вы считаете, что механизм раскрытие звездочки в командой строке отличается от раскрытия звездочки в for? Я утверждаю, что нет.
я тоже считаю, что там один и тот же механизм. И помнится у меня он привёл к печальным последствиям: я автоматически создавал бекап большого числа файлов, и в этот бекап попали не все файлы. Я не знаю, что послужило причиной сбоя, возможно звёздочка раскрылась правильно, но tar не справился с большим объёмом. Факт остаётся фактом: бекап получился битый, ИЧСХ никаких сообщений об ошибке не поступило.
sgfault писал(а): ↑13.04.2012 23:35
Зачем тут xargs, если for - не команда, а ключевое слово языка.
дело не в for, а в звёздочке:
1. она _может_ раскрыться не полностью, и на практике лично я такое наблюдал.
2. перед звёздочкой надо по уму проверить, не является-ли каталог пустым. Иначе в этой вполне штатной ситуации звёздочка не раскроется, и если она в КС, то сама звёздочка и передастся, а если она в for in *, то передастся пустая строка.
$
for f in *; do echo "i='$i'"; done
i=''
echo *
*
3. поведение звёздочки почти не регулируемое. В частности она не отличает каталоги от файлов, не понимает, что симлинк это не обычный файл, и не видит скрытых файлов.
4. Звёздочка выдаёт не просто список файлов, а
отсортированный список. Практически всегда это не нужно. Какой смысл тратить ресурсы на ненужную сортировку? (если каталог большой, то ресурсы не малые, ибо сортировать надо "на месте", а это O(N*log(N)) по времени, и ещё O(N) по памяти).
sgfault писал(а): ↑13.04.2012 23:35
А с вашим любимым find-ом, кстати, будет куча проблем с симлинками.
вот как раз с find никаких проблем и не будет: есть там опции -P, -L, и -H, которые позволяют мне обрабатывать симлинки именно так, как _мне_ это нужно. А не как звёздочка, которая (не)раскрывается так, как _она_ хочет.
sgfault писал(а): ↑13.04.2012 23:35
Конечно, к вашему варианту это не относится, тк вы предусмотрительно написали '-type f'. Но просто обычно выкидывать симлинки - не самое лучше, чем можно заниматься на АФ что можно придумать. Все-таки.
ну не нравится такое поведение - поменяйте. К вашему распоряжению кроме упомянутых H,L,P есть ещё xtype & follow. Для звёздочки всего этого нет, и не будет...
sgfault писал(а): ↑13.04.2012 23:35
Ах, да, еще: если вы утверждаете, что в двух описанных выше сценариях обработки bash-ем скрипта используется разная реализация pathname expansion..
не утверждаю. Думаю одна и та же, только вот работает она иначе (пример выше)