chown -R root: root. * в / root выполняет chown on /

450
J.Lambrecht

При запуске команды в заголовке из / root она как-то переходит на / и меняет владельца на ALLfiles, я заметил это только потому, что всплыли сообщения об ошибках для / proc.

Может быть, я старею, но должен. и .. не быть проигнорированным любой командой? AFAIK они там из-за файловой системы и не служат никакой другой цели.

работает Debian Wheezy с последними обновлениями.

0

2 ответа на вопрос

4
a CVn

Maybe i'm getting old but should . and .. not be ignored by any command ? AFAIK these are there because of the filesystem and serve no other purpose.

That would make no sense, simply because you specifically fed the names . and .. to chown by your chown <...> .*. In such an instance, why should chown think that you didn't do what you wanted to do?

The names were fed to chown because the shell expanded them based on the shell glob expansion criteria you gave it, which matched both . and .. along with every other dot-directory in the current directory. Since you told chown to work recursively, it descended into those directories and anything below them. This means it "descended into" .. and then kept working from there.

You can try this out yourself by doing echo .* to see the names that were fed into chown's command line. Compare that to the output of echo * with shopt dotglob on and off respectively (shopt -s dotglob to turn on, shopt -u dotglob to turn off). Use ls rather than echo to see the first level of recursion.

There are perfectly valid reasons for running even a chown -R on either . or ... The most obvious seems to be to extract an archive that has incorrect ownership information on files and all files within a single directory; in such a case, chown -R abc:xyz . from within the uncompressed directory is a perfectly reasonable thing to do, to reset ownership to something reasonable on your system.

If you want your shell to not expand .* into . and .. then you need to make sure that it is set up correctly for your particular shell. For example, quoting from the GNU bash 4.2.37(1)-release (current on Debian Wheezy at the time of this writing, Debian bash package version 4.2+dfsg-0.1+deb7u3 on amd64 architecture) man page:

GLOBIGNORE
A colon-separated list of patterns defining the set of file names to be ignored by pathname expansion. If a filename matched by a pathname expansion pattern also matches one of the patterns in GLOBIGNORE, it is removed from the list of matches.

Remember that part of the Unix philosophy is "trust that the user knows what they are doing".

Я обучался Unix в 1993 году. J.Lambrecht 8 лет назад 0
Любые манипуляции на. или .. запрещено. Поэтому мы используем ./ или ../, так как chown .. может заставить команду chown вести себя нежелательно. из руководства для начинающих bash TLDP по расширению имени файла Переменная оболочки GLOBIGNORE может использоваться для ограничения набора имен файлов, соответствующих шаблону. Если установлено значение GLOBIGNORE, каждое совпадающее имя файла, которое также соответствует одному из шаблонов в GLOBIGNORE, удаляется из списка совпадений. Имена файлов. и .. всегда игнорируются, даже если установлен GLOBIGNORE. J.Lambrecht 8 лет назад 0
@ J.Lambrecht "Я обучался Unix в 1993 году." Тогда вы должны знать, что Unix! = Linux! = GNU. Linux только начал набирать обороты в 1993 году, а GNU был все еще довольно примитивным по сравнению с сегодняшним днем. Я добавил цитату со страницы руководства bash в моей системе, которая является текущей версией Debian Wheezy. Это вовсе не указывает на то, что `.` и` ..` неявно являются списком, если $ GLOBIGNORE не установлен. a CVn 8 лет назад 0
TLDP [Руководство по Bash для начинающих] (http://www.tldp.org/LDP/Bash-Beginners-Guide/html/) последний раз обновлялось шесть с половиной лет назад (20081227). Для сравнения, в то время для [GNU bash] (ftp://ftp.gnu.org/gnu/bash/) версия 3.2 была актуальной. a CVn 8 лет назад 0
Чтобы не включать `..` в список расширений, используйте`. [^.] * `: Это расширит все файлы, начинающиеся с` .`, кроме `.`` и` ..`. Проверьте, сравнив `echo. *` С `echo. [^.] *`. (Для справки, я изучил Unix в 1985 году.) AFH 8 лет назад 1
@AFH Я делаю это все время, но это не то, о чем спрашивал ОП, поэтому я не включил это в свой ответ. a CVn 8 лет назад 0
Что это, питательная среда для аутизма? Спасибо AFH, это самый полезный комментарий на данный момент. J.Lambrecht 8 лет назад 0
@ J.Lambrecht Единственный вопрос, который я вижу в вашем вопросе: «Должен ли ... и не игнорироваться какой-либо командой?». Stack Exchange в целом работает, предоставляя ответы * на заданный вопрос *; мы не обходимся и * не догадываемся * о том, что вы спрашиваете (и мы даже откладываем вопросы, чтобы на них нельзя было ответить, если вопрос не ясен о том, что задают, до тех пор, пока вопрос не будет решен, надеюсь, ОП). Если вы хотите знать, как избежать такого поведения, вам следует спросить об этом, а не о том, должны ли `.`` и` ..` игнорироваться "любой командой". a CVn 8 лет назад 1
спасибо, в любом случае, я был серьезно шокирован, никогда не сталкивался с неожиданным поведением с расширением имени файла, до пятницы J.Lambrecht 8 лет назад 0
1
Romeo Ninov
  1. Dot (.) can't be ignored because is current directory
  2. Double dot (..) (upper directory) will not be ignored because it mach the wildcard

But if you exec it on this way you will have not such effect

chown -R root:root * 

If you want to change only hidden files, directories try this:

find . -regex '.*/\..*' -exec chown root:root {} \; 
использование * не то же самое, что использование. * J.Lambrecht 8 лет назад 0
проверьте http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html на странице «Расширение имени файла» внизу страницы, где явно указано, что ее следует игнорировать. а также .. J.Lambrecht 8 лет назад 0
Таким образом, вы хотите сделать это только для скрытых файлов и каталогов. Смотрите мой отредактированный ответ Romeo Ninov 8 лет назад 0
я не могу в это поверить, . и .. НЕОБХОДИМО игнорировать, если только они не используются как ./ и ../ это нарушает само поведение chown, включающее его в обширную команду J.Lambrecht 8 лет назад 0
@ J.Lambrecht `.` и` ..` игнорируются только в том случае, если задан не пунктирный * fileglob. `. *` будет соответствовать `.` и` ..` и `.foo` и` .bar`. По сути, `*` не включает «скрытые» файлы, что означает что-либо, начинающееся с `.`, но`. * `Переопределяет это поведение и включает _anything_, начинающийся с` .`, и да, включая каталоги. PS. Я тренировался в 89 году. : / Otheus 8 лет назад 1
вздох. Никогда раньше такого не случалось со мной. Я даже забыл про "правила" расширения имени файла после всего этого времени. Тем не менее, я раздражен, потому что это меняет линию поведения при работе с файлами. Файлы .files не должны быть причиной для исключения. Полагаю, мое эго получило удар. J.Lambrecht 8 лет назад 0

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