Требуется абсолютный путь для каждой строки из текстового файла с использованием сценария оболочки [закрыто]

Похоже, что в вашей среде отсутствует каталог /usr/sbin, содержащий такие системные программы.

Для быстрого исправления следует использовать /usr/sbin/adduser вместо простого adduser.

Два альтернативных решения:

  1. Измените PATH в .bashrc и/или .bash_profile, чтобы /usr/sbin включен в список. Например, вот моя настройка:

     export PATH="$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin:/bin: /usr/местные/игры:/usr/игры"
     
  2. Отредактируйте конфигурацию sudoers (с помощью sudo visudo -f /etc/sudoers.d/securepath) и добавьте эту строку в пустой файл:

     # Расширьте ПУТЬ для sudo-команд
    По умолчанию secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
     

Либо было бы достаточно.

0
18.11.2018, 08:16
3 ответа

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

stackoverflow.sh

#!/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 ). Очевидно, поскольку вы также повторяете имя только файла (, а не путь ), на выходе будет список как файлов, так и путей.

Единственное, я думаю, может вызвать проблемы, если ваш файл закодирован в юникоде, а сами имена файлов не имеют юникода. В противном случае он печатает абсолютный путь к файлу.

stackoverflow.sh:

#!/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
0
28.01.2020, 02:25
for NAME in $(cat list2.txt); do readlink -e $NAME; done
0
28.01.2020, 02:25

Спасибо за все ваши ответы.
Проблема решена.:)
Может возникнуть проблема с текстовым файлом, который я передаю, я только что создал новый текстовый файл и скопировал в него все данные.

Передача этого нового файла в цикле for отлично работает с самим моим кодом, например:

#!/bin/sh
NAMES=`cat myNewList.txt`
for NAME in $NAMES; 
 do
  find $PWD -type f -name "$NAME"
 done
0
28.01.2020, 02:25

Теги

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