定位目录/文件名

定位目录/文件名

我有一个名为的文件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基于 的解决方案)。

相关内容