У меня в скрипте есть следующая строка:
find ~ Templates -maxdepth 0 -type d -empty
что работает отлично, как и ожидалось. Однако когда я копирую свой скрипт на общий ресурс samba и запускаю его оттуда ( bash myscript.sh
), find
не находит каталог:
find: ‘Templates’: No such file or directory
Переменные $PATH одинаковы, в strace я тоже не смог найти причину этого.
Кто-нибудь знает, почему find так себя ведет? Это баг или я не так использую find
команду, как положено?
использую Ubuntu 19.10 и bash 5.0
решение1
Вы получаете сообщение, find: ‘Templates’: No such file or directory
потому что подкаталог Templates отсутствует.
- либо - с момента запуска скрипта
- или - в каталоге, в который
cd
переключился кто-то не упомянутый в вашем скрипте
Мне интересно, опечатка ли это, и вы имели в виду ~/Templates
. В любом случае, вы не должны использовать ~
в скрипте, а вместо этого использовать "$HOME"
, поэтому результирующий путь будет "$HOME/Templates"
.
решение2
"нет, потому что Templates — это каталог, который я ищу в '~' или домашнем каталоге пользователя"
find ~ -maxdepth 0 -type d -empty -name Templates
решение3
Почему вы считаете, что у Samba те же переменные окружения, что и у Linux?
Используйте реальный/полный путь к каталогу, в котором вы хотите выполнить поиск, поскольку ~
это не каталог, он, вероятно, пуст — вот почему find обрабатывается Templates
как путь, а не как шаблон поиска ( find: ‘Templates’: No such file or directory
).
Можете ли вы запустить shell в вашем каталоге samba и посмотреть, что там с помощью $ pwd
? Вы также можете проверить всю среду с помощью $ set
;
Глава «Использование переменных книги Samba»говорит, что домашний каталог %H
не является ~
.
небольшой эксперимент:
$ ls -l | grep -E '^d' # to show there is 1 directory (tmp), which is not empty but doesnt have `Templates`
drwxr-xr-x 2 user group 24576 Mar 16 16:16 tmp
$ find Templates -maxdepth 0 -type d -empty # as if <path> (`~`) was empty
find: Templates: No such file or directory
$ find tmp Templates -maxdepth 0 -type d -empty # as if `~` was `tmp`
find: Templates: No such file or directory
Либо ~
он пуст (первый find ...
с «пустым» путем), либо его нет Templates
в искомом пути (второй find
).
$ touch Templates
$ find tmp Templates -maxdepth 0 -type d -empty # as if `~` was `tmp`
$ rm Templates; mkdir Templates
$ find tmp Templates -maxdepth 0 -type d -empty # as if `~` was `tmp`
Templates
Если
Templates — это каталог, который я ищу в «~» или домашнем каталоге пользователя.
затем
$ find ~ -maxdepth 1 -type d -empty -name Templates
~/Templates
Должно решить проблему.
-maxdepth 0
применяет тесты и действия только к аргументам командной строки (согласночеловек находит; проверьте такжеэтот ответ)