Похоже, что в вашей среде отсутствует каталог /usr/sbin
, содержащий такие системные программы.
Для быстрого исправления следует использовать /usr/sbin/adduser
вместо простого adduser
.
Два альтернативных решения:
Измените PATH
в .bashrc
и/или .bash_profile
, чтобы /usr/sbin
включен в список. Например, вот моя настройка:
export PATH="$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin:/bin: /usr/местные/игры:/usr/игры"
Отредактируйте конфигурацию sudoers
(с помощью sudo visudo -f /etc/sudoers.d/securepath
) и добавьте эту строку в пустой файл:
# Расширьте ПУТЬ для sudo-команд
По умолчанию secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Либо было бы достаточно.
Вот альтернативный способ решения проблемы. Возможно, этот способ сработает для вас. Это вызывает find только один раз, что делает его намного быстрее и эффективнее.
#!/bin/sh
declare -a NAME_LIST=(`cat list2`)
#declare -i LIST_SIZE=${#NAME_LIST[*]}
declare EXPRESSION="find ${PWD} "
# build up the find command
for name in ${NAME_LIST[@]}; do
if test ${NAME_LIST[0]} = ${name}; then
EXPRESSION+="-type f -and -name $name "
else
EXPRESSION+="-or -type f -and -name $name "
fi
done
eval $EXPRESSION
В моей расширенной версии $EXPRESSION
равно:
find /Users/charlie -type f -and -name one -or -type f -and -name two -or -type f -and -name three -or -type f -and -name four -or -type f -and -name five -or -type f -and -name six -or -type f -and -name seven -or -type f -and -name eight
Конечно, ваш исходный код отлично работает для меня в bash на OSX (, который имеет ту же команду find, что и вы в linux ). Очевидно, поскольку вы также повторяете имя только файла (, а не путь ), на выходе будет список как файлов, так и путей.
Единственное, я думаю, может вызвать проблемы, если ваш файл закодирован в юникоде, а сами имена файлов не имеют юникода. В противном случае он печатает абсолютный путь к файлу.
#!/bin/sh
NAMES=`cat list2`
for name in $NAMES; do
echo $name >&2
find $PWD -type f -name $name
done
$ charlie on macbook in ~
❯❯ cat list2
one
two
three
four
five
six
seven
eight
$ charlie on macbook in ~
❯❯./stackoverflow.sh
one
/Users/charlie/one
two
/Users/charlie/src/web/two
three
/Users/charlie/misc/three
four
/Users/charlie/four
five
/Users/charlie/Documents/five
six
/Users/charlie/Documents/Ideas/six
seven
/Users/charlie/seven
eight
/Users/charlie/Documents/eight
$ charlie on macbook in ~
❯❯./stackoverflow.sh
/Users/charlie/one
/Users/charlie/src/web/two
/Users/charlie/misc/three
/Users/charlie/four
/Users/charlie/Documents/five
/Users/charlie/Documents/Ideas/six
/Users/charlie/seven
/Users/charlie/Documents/eight
$ charlie on macbook in ~
❯❯./stackoverflow.sh 2>stderr-output
/Users/charlie/one
/Users/charlie/src/web/two
/Users/charlie/misc/three
/Users/charlie/four
/Users/charlie/Documents/five
/Users/charlie/Documents/Ideas/six
/Users/charlie/seven
/Users/charlie/Documents/eight
$ charlie on macbook in ~
❯❯ cmp list2 stderr-output
$ charlie on macbook in ~
❯❯ echo $?
0
Спасибо за все ваши ответы.
Проблема решена.:)
Может возникнуть проблема с текстовым файлом, который я передаю, я только что создал новый текстовый файл и скопировал в него все данные.
Передача этого нового файла в цикле for отлично работает с самим моим кодом, например:
#!/bin/sh
NAMES=`cat myNewList.txt`
for NAME in $NAMES;
do
find $PWD -type f -name "$NAME"
done