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