Bash 可以搜索指定输入变量的多个顺序变体

Bash 可以搜索指定输入变量的多个顺序变体,bash,find,Bash,Find,我希望能够运行一个查找,使用用户输入值的所有可能的顺序变化($1$2$3..$9或$#really)来查看文件是否存在。但一旦用户只输入3个参数(搜索模式),find命令就会变得有点笨拙: docs=($(find /dir1 /dir2 -type f -iname "*$1*$2*$3" -o -iname "*$1*$3*$2" -o -iname "*$2*$1*$3" -o -iname "*$2*$3*$1*" -o -iname "*$3*$1*$2*" -o -iname "*$

我希望能够运行一个查找,使用用户输入值的所有可能的顺序变化($1$2$3..$9或$#really)来查看文件是否存在。但一旦用户只输入3个参数(搜索模式),find命令就会变得有点笨拙:

docs=($(find /dir1 /dir2 -type f -iname "*$1*$2*$3" -o -iname "*$1*$3*$2" -o -iname "*$2*$1*$3" -o -iname "*$2*$3*$1*" -o -iname "*$3*$1*$2*" -o -iname "*$3*$2*$1*" ))

有没有一种方法可以告诉find采用指定的多个模式并搜索顺序的每个可能变化,以查看文件是否存在?在大多数情况下,我认为用户只会输入2-4个输入参数,但我希望允许使用多达9个输入变量进行搜索,并且我讨厌想象当$#=9时的find命令是什么样子。

我喜欢你的问题。您需要生成位置参数的所有排列。非常有趣:

#!/bin/bash

perms() {
   if (($#==1)); then 
      ary_perms=( "$1" )
      return
   fi
   local i
   local ary=()
   for ((i=1;i<=$#;++i)); do
      perms "${@:1:i-1}" "${@:i+1}"
      ary+=( "${ary_perms[@]/#/${!i}$sep}" )
   done
   ary_perms=( "${ary[@]}" )
}

sep='*'
perms "$@"

searchargs=()
for s in "${ary_perms[@]}"; do
   searchargs+=( -o -iname "*$s*" )
done
searchargs=( "${searchargs[@]:1}" )

find /dir1 /dir2 "${searchargs[@]}"
为什么不仅仅是这个

find /dir1 /dir2 -type f -iname "*$1*" -iname "*$2*" -iname "*$3*"
(在
-iname
之间有一个隐式and)

如果需要脚本来构建搜索命令:

#!/bin/bash

searchargs=()
for i; do
    searchargs+=( -iname "*$i*" )
done
find /dir1 /dir2 -type f "${searchargs[@]}"
好多了,嗯

当然,如果你有重复的论点,这并不是严格等同于前面关于排列的胡言乱语。但是,谁在乎呢,真的?代码简单性在这里胜出


哦,最后一句话,做:

docs=( $(find ...) )

非常糟糕(想想带空格的文件名)。

听起来很有趣,但只做
查找可能会更简单(尽管在进程计数方面可能效率稍低)grep$1 | grep$2 | grep$3
。这将以任何顺序找到他们,三个人都必须在场。。。如果任何一个模式可能是彼此的子字符串,我想这在语义上是有点不同的,不过…实际上我刚刚完整地阅读了你的答案,哦,天哪,你的最后一个片段看起来和我的非常相似。我正在删除我的答案,因为你首先输入了它。1)“现在这当然是一个非常糟糕的方法!你肯定不想这样做。”:我很高兴读到2)“在-iname之间有一个隐式and”:我没有意识到这一点,但我猜如果你需要一个脚本来构建搜索命令,那么“and”而不是-o更有意义DOHpe 3”:谢谢,这让事情变得简单了4)“非常糟糕(想想带空格的文件名)”:while/read<@nanker Re:point 4:如果你想用一种安全的方式将
find
的结果放入数组:
docs=();而IFS=read-r-d“”文件;do docs+=(“$file”);谢谢你的澄清。我就是这么想的。我想我只是在偷懒。实际上,我真的很懒,因为我有一个shell代码段。嘘!
docs=( $(find ...) )