Назад | Перейти на главную страницу

как изменить права доступа к конкретному типу файла

 file * |  grep 'ASCII text' | chmod -x 
chmod: missing operand
Try `chmod --help' for more information.

Приведенная выше команда выдает ошибку. Обычно я пытаюсь найти все файлы, имеющие тип ASCII, и изменить их права доступа на -x. Какая ошибка в синтаксисе выше?

Один: grep 'ASCII text' возвращается не только имя файла, а также тип самого файла; вам нужно обработать вывод, чтобы вернуть только имя файла

Два: chmod не принимает аргументы от STDIN, что вы пытаетесь сделать с конвейером |. Вам придется либо использовать xargs или оберните вышеуказанное в for петля

Тем не менее, вот два решения для вас:

Решение №1: с трубами

file * | awk '/ASCII text/ {gsub(/:/,"",$1); print $1}' | xargs chmod -x

Решение # 2: с циклом for

for fn in $(file * | awk '/ASCII text/ {gsub(/:/,"",$1); print $1}'); do chmod -x "$fn"; done

Выбери свой яд :-)

Это должно работать независимо от того, содержат ли имена файлов пробелы или двоеточия:

find -maxdepth 1 -type f -exec sh -c 'file -b "{}" | grep -sq ASCII' \; -print0 | xargs -0 chmod -x

Вы можете удалить -maxdepth 1 чтобы сделать его рекурсивным.

Могут быть ложные срабатывания, если сами имена файлов содержат строку «ASCII».

Редактировать:

Я включил предложение pepoluan об использовании -b вариант для file поэтому имя файла не выводится для теста grep. Это должно исключить ложные срабатывания.

for f in `file * | grep "ASCII text" | awk "{print \\$1}" | awk -F ":" "{print \\$1}"`; do chmod -x "$f"; done

И еще один лайнер - имейте в виду, что нужно снимать : ASCII Text И тоже процитируй имена

file * | grep 'ASCII text' | sed  's|\(^.*\):.*|\"\1\"|'| xargs chmod -x