Оболочка Bourne является своего рода старинными вещами. Версия Соляриса не имеет -e
оператор для test
(иначе. [
) встроенный, который был представлен несколько поздно в жизни Оболочки Bourne ¹ и хранен POSIX.
Как обходное решение, можно использовать -f
протестировать на существование регулярного файла, или -r
если Вы не интересуетесь нечитабельными файлами.
Лучше, изменение #!/bin/sh
кому: #!/usr/xpg4/bin/sh
или #!/bin/ksh
чтобы получить оболочку POSIX.
Остерегайтесь этого [ $option -eq 9 ]
является, вероятно, не правильным: -eq
числовой оператор сравнения, но $option
не является действительно числовым — это - дата. На 32-разрядной машине, когда 201301271355
интерпретируется как число, оно взято по модулю 232. Это так происходит, что никакая дата в 21-м веке не очень близко к 0 232 по модулю, но полагающийся на это является очень хрупким. Сделайте это [ "$option" = 9 ]
вместо этого.
Как общий принцип программирования оболочки, всегда помещаемые двойные кавычки вокруг переменной и замен команды: "$foo"
, "$(foo)"
. Если Вы не делаете, оболочка разделяет результат в каждом пробельном символе и рассматривает каждое получающееся слово как подстановочный шаблон имени файла. Так незащищенное $foo
только безопасно если значение foo
не содержит пробела или \[?*
. Избегите рискованных действий и всегда используйте двойные кавычки (если Вы не предназначаете разделение и сопоставление с образцом для случая).
¹ Или действительно ли это было ksh дополнение, никогда не портируемое Bourne? Я не уверен.
Можно сделать всю задачу, использующую просто find
:
$ find . -type f ! \( -perm 755 -o -perm 644 \) -printf "%m\t%p\n"
Сделайте все перестановки полномочий (000-777).
$ touch {0..7}{0..7}{0..7}
$ for i in {0..7}{0..7}{0..7}; do chmod $i $i;done
$ find . -type f | wc -l
512
Образец нашего find
список команды файлов это находит:
$ find . -type f ! \( -perm 755 -o -perm 644 \) -printf "%m\t%p\n"| head -10
734 ./734
376 ./376
555 ./555
663 ./663
256 ./256
336 ./336
2 ./002
152 ./152
527 ./527
416 ./416
Если мы выполняем наш find
команда мы можем подтвердить, что она работала:
$ find . -type f ! \( -perm 755 -o -perm 644 \) -printf "%m\t%p\n" | grep 755
$ find . -type f ! \( -perm 755 -o -perm 644 \) -printf "%m\t%p\n" | grep 644
find . \( \
-type d ! -perm 755 -o \
-type l ! -perm 777 -o \
-type f ! \( -perm 644 -o -perm 755 \) -o \
! -type f ! -type l ! -type d ! -perm 644 \) -exec ls -ld {} +
find . -printf "%m\t%p\n" | grep -Ev "^(755|644)"
Пример произвел:
$ find . -printf "%m\t%p\n" | grep -Ev "^(755|644)"
777 ./a/writable/folder
777 ./another/folder
666 ./an/executable-file
Обратите внимание на то, что egrep
команда не рассматривает, является ли строка файлом или папкой. В результате файлы с разрешением 755 и папки с разрешением 644 не были бы найдены этой командой.
Кроме того, эта команда не очень эффективна, как find
запускается путем печати всех подпапок и субфайлов, и только после этого файлы и папки фильтрованы egrep
. Однако я еще не нашел лучший метод.
-r-sr-s--T
(7550). egrep
и find
одновременно, здесь нет никакой проблемы эффективности.
– Stéphane Chazelas
08.02.2014, 16:50
find
реализацию рассматривают-perm 755
как-perm 01363
, или achmod
реализацию рассматриваютchmod 755
какchmod 01362
, Вы думали бы, что кто-то заметит к настоящему времени и сообщит об этом как об ошибке. Обратите внимание, что существует только одна реализацияfind
это поддерживает-printf
. – Stéphane Chazelas 08.02.2014, 19:35find(1)
, но в другом месте... Я выработал привычку создания восьмеричного для полномочий файла, явных, когда я был укушен десятичным числом (несколько десятилетий назад, не помните много детали). – vonbrand 08.02.2014, 22:38