В чем разница между * и *. * При копировании?

19

В чем разница между следующими 2 командами?

cp -rp /dir1/*.* /dir2/
cp -rp /dir1/* /dir2/
Stany
источник
12
Хотя оба ответа верны, я думаю, что есть одна вещь, которую стоит отметить. Скрытые файлы (файлы, начинающиеся с .лайка .bashrc) не копируются ни одной из этих команд. Чтобы скопировать эти файлы, вы должны явно указать, что для .*того, чтобы скопировать все файлы (включая скрытые), команда будетcp -rp /dir1/.* /dir1/* /dir2/
YoMismo
Короче говоря, *.*это способ MS-DOS / Windows, а способ *UNIX / Linux. В Unix суффикс (окончание файла, часть после .- как .txtили .jpg) необязателен ... В MS-DOS .(точка) и суффикс требовались, поэтому для сопоставления всех файлов использовался один, *.*а для сопоставления всех текстовых файлов. один будет использовать *.txt.
Баард Копперуд
Суффикс @BaardKopperud не требуется, могут быть файлы с такими именами, как FILENAMEили даже FILE.
Руслан
1
@Ruslan, но *.*в DOS по-прежнему соответствует файлам с именем FILENAMEили FILE, потому что имя «реально» FILENAME.или FILE.(с пустым расширением). В Unix, имя «действительно» FILENAMEили FILE, так *.*не будет соответствовать.
Джонатан Каст
1
@Ruslan Это было необходимо для реального DOS, больше не требуется для Windows. В былые времена сингл *только соответствовал FILE, а не совпадал FILE.TXT.
Random832,

Ответы:

25

*.*сопоставляет только имена файлов с точкой в ​​середине или в конце. Например:

abc.jpg
def. 

*совпадает с именами файлов выше, плюс имена, которые не имеют точки вообще. например:

data
Дэвид Дай
источник
6
Возможно также обратите внимание, что анти-идиома *.*раньше была правильным способом сопоставления всех файлов в MS-DOS в день 8 + 3 имен файлов. В MS-DOS точка является обязательной (хотя и неявной для файлов, которые не имеют расширения).
Трипли
11
@ Марк, нет, я так не думаю. если у вас нет дотглоба.
Дэвид Дай
11
Да, я никогда не понимал, что *.*соответствует, foo.но нет .foo. Эта асимметрия ужасна.
Джеймсдлин
9
@jamesdlin, из руководства по bash: когда для расширения имени файла используется шаблон, символ '.' в начале имени файла или сразу после слэша должен явно совпадать, если не установлен параметр оболочки dotglob.
Дэвид Дай
1
@jamesdlin. Начиная с 1-го дня Unix (около 1969 г.), записи каталога, начинающиеся с точки, считались скрытыми . Первоначально это было необходимо для пропуска записей .(текущего каталога) и ..(родительского каталога), которые всегда существуют в любом каталоге (даже в пустых каталогах). Позже Ричи и Томпсон сочли полезной функцию скрытия (по умолчанию) всех .*rcфайлов конфигурации и добавили явную -aопцию lsдля отображения всех этих (начальных точек) «скрытых» записей. Так что это не очень удивительно, зная историю Unix. Ведущая точка в Unix была особенной с "навсегда".
Ариэльф
13

Предположим, у вас есть следующие файлы в /dir1:

foobar  
foo.bar  
fo.ba  
foo1.bar2  
foobar1  
foobar2  

cp -rp /dir1/*.* /dir2/

Эта команда скопирует только следующие файлы:

foo.bar  
fo.ba  
foo1.bar2 

cp -rp /dir1/* /dir2/

Это скопирует все файлы в /dir1

Условие распространяется также и на подкаталоги /dir1.

Ньюландс
источник