Команда на изменение разрешений только для файлов, а не каталогов
У меня есть следующая команда
find . -type f -print0 | xargs -0 chmod 644
который успешно изменил бы на 644 разрешения для всех файлов в., при условии, что имена файлов не содержали встроенных пробелов. Однако это не работает в целом.
Например
touch "hullo world"
chmod 777 "hullo*"
find . -type f -print0 | xargs -0 chmod 644
возвращается
/bin/chmod: cannot access `./hello': No such file or directory
/bin/chmod: cannot access `world': No such file or directory
Есть ли способ изменить команду, чтобы она могла работать с файлами со встроенными пробелами?
Большое спасибо за любой совет.
1 ответ
Без xargs
find . -type f -exec chmod 644 {} \;
или с xargs
find . -type f -print0 | xargs -0 -I {} chmod 644 {}
используемый xargs
переключатели
-0
Если есть пробелы или символы (включая символы новой строки), многие команды не будут работать. Эта опция заботится об именах файлов с пустым пространством.-I
Заменить вхождения replace-str в исходных аргументах именами, считанными из стандартного ввода. Кроме того, пробелы без кавычек не заканчивают элементы ввода; вместо этого разделителем является символ перевода строки.
Объяснение взято отсюда