Вот альтернативный способ решения проблемы. Возможно, этот способ сработает для вас. Это вызывает 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
Если ваша версия Vim скомпилирована с поддержкой multibyte
и ваша терминальная кодировка установлена правильно, вы можете использовать Unicode поле -символы рисования , которые включают горизонтальные и вертикальные линии, а также несколько разновидностей перекрестков и блоков. Vim определяет некоторые орграфы по умолчанию для этих символов, например vv
для │
(, чтобы ввести орграф, вы используете Ctrl-K ; таким образом, в режиме вставки ^Kvv
будет вставлен символ │
в позицию курсора ). Чтобы получить полный список, если ваша версия Vim поддерживает его, введите :digraphs
; для получения дополнительной информации об этой функции и для поиска по имени символа Unicode,тип :help digraphs
.
Однако, в зависимости от настроек вашего терминала и выбора шрифта, не все символы рисования блока -могут отображаться как соединенные линии, поэтому ваш пробег может отличаться. Например, на моем компьютере вертикальные линии отображаются как соединенные в терминале (с использованием Source Code Pro ), но как прерывистые линии в GVim (с использованием DejaVu Sans Mono):
Для полноты относительно предыдущего ответа:
^kvv
приводит к │ ^kdr
приводит к ┌ ^khh
приводит к ─ ^kdl
ведет к ┐ ^kur
приводит к À ^kul
ведет к ┘ Обратите внимание, что вы можете использовать верхний регистр для более толстой линии.:
^kVV
равно ┃ ^kDR
это ┏ ^kHH
это ━ ^kLD
это ┓ (LD, а не DL, почему-то)^kUR
равно ┗ ^kUL
равно ┛ Существуют также версии с одним верхним и одним нижним регистром.