[: двоичный оператор expected

Если вы хотите найти материал с установленным липким битом, вам понадобится параметр -perm , версия с косой чертой проверяет любой из битов, но мы собираемся предоставить только один бит, то есть восьмеричная версия липкого бита:

find . -perm /1000

Теперь вы хотите сделать обратное, поэтому отмените условие:

find . \! -perm /1000

И с поправкой на вашу команду:

find . -mtime +3 -a \( -type f -o -type d \) \! -perm /1000
0
09.10.2018, 17:17
1 ответ
[ -d ${TRAVIS_REPO_SLUG#*/}-${TRAVIS_BRANCH}-*-backup ];

*без кавычек здесь заменяется на любые совпадающие имена файлов

$ mkdir test-master-123-backup test-master-456-backup
$ a=test b=master
$ echo $a-$b-*-backup
test-master-123-backup test-master-456-backup

Итак, [получает больше аргументов, чем ожидалось для -d. Вероятно, он получает всего три(-dи имена файлов ), поскольку в этом случае он ожидает, что средний оператор будет бинарным оператором, как намекает сообщение об ошибке.

Версия, в которой *указан в кавычках, не должна выдавать ту же ошибку, вместо этого она будет искать файл с литералом *в имени, что, вероятно, не то, что вам нужно.

Если вы хотите узнать, есть ли каталоги, соответствующие этому шаблону, вы можете сделать что-то вроде этого:

any=0
# set IFS to empty if you expect to have directories with whitespace in names
# IFS=''    
for f in $a-$b-*-backup; do
    if [ -d "$f" ]; then
        any=1
    fi
done
if [ "$any" = 1 ]; then
    echo "some directories matching $a-$b-*-backup were found"
fi

Или немного проще в Bash. Косая черта в конце заставляет глобус соответствовать только каталогам, а nullglobпревращает глобус в пустой список, если он ничему не соответствует:

IFS=''
shopt -s nullglob
set -- $a-$b-*-backup/
if [ "$#" != 0 ]; then
    echo "$# directories matching $a-$b-*-backup were found"
fi
2
28.01.2020, 02:31

Теги

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