У меня есть файл с именем client.txt
, который содержит названия компаний, как показано ниже
google
amazon
facebook
apple
С этими названиями компаний у меня есть папки и файлы. Я хочу знать путь ко всем папкам / файлам и вывод должен хранить в файле. Например:
ls -R | grep google\|amazon
Если я использую эту команду, я получу путь к файлам / каталогам Google и Amazon. Точно так же мне нужно для всех имен клиентов, доступных в этом файле, что также в сценариях оболочки.
Используя сценарии для построения find
команда можно было сделать что-то как (Read man find;man bash
):
# Goal: find $dir -name 'google -o -name 'amazon' -o -name 'facebook' ... -print
#
dir="starting directory"
#
names=""
for name in $(cat client.txt) ; do
if [[ -z "$names" ]] ; then
names="-name '$name' "
else
names="$names -o -name '$name' "
fi
done
# use 'eval' to expand the 'names' variable at the right time
eval find $dir $names -print
Несколько quick'n'dirty путей - на основе Вашего grep
подход:
find . -print0 | grep -Fzf client.txt
или
shopt -s globstar
printf '%s\0' **/* | grep -Fzf client.txt
И будет безопасно для любых легальных имен файлов и даст разграниченный пустым указателем список путей, которые можно передать другой программе. Примечание, что оба будут соответствовать записям от client.txt
где угодно в пути - который не может быть тем, что Вы хотите.
А более сложный путь, собирая список -name
аргументы в пользу find
использование массива оболочки:
while IFS= read -r client; do namearr+=(-name "$client" -o); done < client.txt
find . \( "${namearr[@]}" -false \) -print
Изменение -print
к -print0
для получения разграниченных пустым указателем результатов как другие методы. Примечание, что это соответствует точным именам файлов . Вы могли измениться -name "$client"
на [1 110] для получения подстановочного соответствия в имени файла (или к [1 111] для получения соответствия где угодно в пути, подобном grep
- базирующиеся решения).