найти . -type f -exec chmod 644 {} ;

почему это не работает Я пытаюсь изменить все файлы на 644 abd all -d на 755:

find . -type f -exec chmod 644 {} ;

я получаю: find: отсутствует аргумент для `-exec' спасибо


person user1920187    schedule 02.11.2013    source источник
comment
Завершить с помощью \;, а не только с ;.   -  person Michael Berkowski    schedule 02.11.2013
comment
...это потому, что все, что следует за -exec, рассматривается как его аргумент. Если бы у вас был голый ;, он рассматривался бы как терминатор для всего find, но на самом деле вам нужно завершить exec, поэтому он должен быть экранирован как часть строки аргумента.   -  person Michael Berkowski    schedule 02.11.2013
comment
возможный дубликат Как установить chmod для папки и всех ее подпапок и файлов в терминале Linux Ubuntu?   -  person Michael Berkowski    schedule 02.11.2013
comment
@МайклБерковски Спасибо!!!!   -  person Nick Rolando    schedule 27.06.2020


Ответы (3)


Передача в xargs — это грязный способ сделать то, что можно сделать внутри find.

find . -type d -exec chmod 0755 {} \;
find . -type f -exec chmod 0644 {} \;

Вы можете еще больше контролировать с помощью других опций, таких как:

find . -type d -user harry -exec chown daisy {} \;

Вы можете делать очень классные вещи с find, а можете делать и очень опасные вещи. Взгляните на «найти человека», это длинно, но стоит быстро прочитать. И, как всегда, помните:

  • Если вы root, все получится.
  • Если вы находитесь в корне (/), у вас будет плохой день.
  • Использование /path/to/directory может сделать вещи намного безопаснее, поскольку вы четко определяете, где вы хотите запустить find.
person Phil    schedule 28.02.2014
comment
Почему метод xargs может быть грязным? Огромным преимуществом является запуск chmod только один раз со всеми файлами в качестве аргументов. Метод -exec chmod создаст подпроцесс для каждого файла. - person Breaking not so bad; 10.09.2015
comment
Если вы хотите запустить chmod только один раз, измените его на find . -type f -exec chmod 0644 {} +, который работает практически так же, как метод xargs, создавая одну командную строку. (\ выше предназначен только для выхода из точки с запятой.) - person johnthacker; 02.08.2016
comment
Быстрый анлайнер: find . -type d -exec chmod 0755 {} \; && find . -type f -exec chmod 0644 {} \; - person lucaferrario; 29.12.2017
comment
Примечание. xargs обычно превосходит exec. С exec команда вызывается для КАЖДОГО ввода, но с xargs команда обычно запускается ОДИН РАЗ. Поэтому, если ваш поисковый запрос дает тысячи результатов, xargs будет в несколько раз быстрее! - person MarcoZen; 05.07.2021

Хорошая альтернатива:

find . -type f | xargs chmod -v 644

и для каталогов:

find . -type d | xargs chmod -v 755

и, чтобы быть более явным:

find . -type f | xargs -I{} chmod -v 644 {}
person Seth Malaki    schedule 02.11.2013
comment
Как обрабатывать найденные файлы с пробелами? Я получаю ошибки, имя файла разделено пробелами, и он пытается запустить chmod для каждой разделенной части. - person Lidia; 20.01.2016
comment
@ Лидия, попробуйте добавить опцию -print0, чтобы найти и xargs -0. - person user88595; 30.03.2016
comment
@TALlieri Большое спасибо - person Lidia; 30.03.2016

Мне это нужно так часто, что я создал функцию в своем ~/.bashrc файле:

chmodf() {
        find $2 -type f -exec chmod $1 {} \;
}
chmodd() {
        find $2 -type d -exec chmod $1 {} \;
}

Теперь я могу использовать эти ярлыки:

chmodd 0775 .
chmodf 0664 .
person Fabian Schmengler    schedule 23.03.2017