Если вы хотите найти материал с установленным липким битом, вам понадобится параметр -perm
, версия с косой чертой проверяет любой из битов, но мы собираемся предоставить только один бит, то есть восьмеричная версия липкого бита:
find . -perm /1000
Теперь вы хотите сделать обратное, поэтому отмените условие:
find . \! -perm /1000
И с поправкой на вашу команду:
find . -mtime +3 -a \( -type f -o -type d \) \! -perm /1000
[ -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