Команда на изменение разрешений только для файлов, а не каталогов

У меня есть следующая команда

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 в исходных аргументах именами, считанными из стандартного ввода. Кроме того, пробелы без кавычек не заканчивают элементы ввода; вместо этого разделителем является символ перевода строки.

Объяснение взято отсюда

Другие вопросы по тегам