Которые управляют для использования для нахождения всех файлов/папок с полномочиями не по умолчанию?

Оболочка 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? Я не уверен.

4
08.02.2014, 16:23
3 ответа

Можно сделать всю задачу, использующую просто 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
9
27.01.2020, 20:46
  • 1
    находятся на 12 битах, не 9. –  Stéphane Chazelas 08.02.2014, 17:23
  • 2
    @StephaneChazelas - Я знаю, что просто показывал общие. –  slm♦ 08.02.2014, 17:33
  • 3
    Для устойчивости я записал бы 0755 и т.д. (это является восьмеричным, некоторый идиотичный инструмент мог бы понять десятичное число...), хороший –  vonbrand 08.02.2014, 18:15
  • 4
    @vonbrand, если a find реализацию рассматривают -perm 755 как -perm 01363, или a chmod реализацию рассматривают chmod 755 как chmod 01362, Вы думали бы, что кто-то заметит к настоящему времени и сообщит об этом как об ошибке. Обратите внимание, что существует только одна реализация find это поддерживает -printf. –  Stéphane Chazelas 08.02.2014, 19:35
  • 5
    @StephaneChazelas, возможно, нет find(1), но в другом месте... Я выработал привычку создания восьмеричного для полномочий файла, явных, когда я был укушен десятичным числом (несколько десятилетий назад, не помните много детали). –  vonbrand 08.02.2014, 22:38
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 {} +
3
27.01.2020, 20:46
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. Однако я еще не нашел лучший метод.

2
27.01.2020, 20:46
  • 1
    запуска, Которая пропустила бы файлы как -r-sr-s--T (7550). egrep и find одновременно, здесь нет никакой проблемы эффективности. –  Stéphane Chazelas 08.02.2014, 16:50

Теги

Похожие вопросы