我有一个名为的文件client.txt
,其中包含以下公司名称
google
amazon
facebook
apple
有了这些公司名称,我就有了文件夹和文件。我想知道所有文件夹/文件的路径,输出应该存储在一个文件中。例如:
ls -R | grep google\|amazon
如果我使用此命令,我将获得 google 和 amazon 文件/目录路径。同样,我也需要该文件中所有可用的客户端名称,这也是在 shell 脚本中。
答案1
使用脚本构建find
命令,可以执行以下操作(阅读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
答案2
grep
根据您的方法,有几种快速而简单的方法:
find . -print0 | grep -Fzf client.txt
或者
shopt -s globstar
printf '%s\0' **/* | grep -Fzf client.txt
两者对于任何合法文件名都是安全的,并提供可以传递给另一个程序的以空分隔的路径列表。请注意,两者都将匹配client.txt
路径中任意位置的条目-这可能不是你想要的。
一种更复杂的方法,使用 shell 数组组装一个-name
参数列表:find
while IFS= read -r client; do namearr+=(-name "$client" -o); done < client.txt
find . \( "${namearr[@]}" -false \) -print
更改-print
为-print0
以获得像其他方法一样的空分隔结果。请注意,这与确切的文件名匹配。您可以更改-name "$client"
为-name "*$client*"
以在文件名内获取通配符匹配(或更改为 以-path "*$client*"
在路径中的任何位置获取匹配,类似于grep
基于 的解决方案)。