查找命令:列表中的名称

查找命令:列表中的名称

我有一个包含名称列表的文件:

john
paul
ringo
george
...

然后我有一堆具有很多不同名称的文件:

maria.iso
jose.iso
pablo.iso
john.iso
jack.iso
jane.iso
...

我想执行一个find命令,仅输出与文件列表之一同名的文件,如果不匹配则不输出任何文件。在我的例子中:

john

像这样的东西:

find . -type f -name "*.iso" (in array)

但我不知道这是否可能,或者如果可能的话从哪里开始。

到目前为止,我唯一的想法是编写一个 for 循环,但这看起来很丑陋而且效率很低。

谢谢

答案1

用于readarray将名称读入数组names。然后循环数组中的每个元素来执行命令find

readarray names < names.txt

for n in ${names[@]};do
    find . -type f -name "${n}.iso"
done

答案2

find您可以在:中进行“或”测试find . -name a -o -name b ...

因此,修改文件以添加开关,并使用xargs构建 find 命令:

awk 'NR > 1 {print "-o"}; {print "-name", $0".iso"}' input-file | xargs find . 

对于足够小的列表,这应该只运行一个find.如果文件名中有空格、引号或其他特殊字符,请考虑使用由 ASCII 空字符分隔的记录(在这种情况下,可以使用 GNU sed 修改输入)。

答案3

使用以下命令会更容易zsh

names=(${(f)"$(<name-list.txt)"})

ls -ld -- **/(${(~j[|])names}).iso(D)

在哪里:

  • $(<file)ksh 风格的运算符,可扩展到以下内容file
  • f参数扩展标记了行上的分割f,因此我们存储$namesname-list.txt
  • j[|]:用 with 连接数组的元素|
  • ~将其|视为全局运算符(此处用于交替)而不是文字|
  • **/:递归通配符(在任何级别的子目录中搜索)。
  • (D): glob 限定符,启用dotglob(包括隐藏文件并在隐藏目录中进行搜索,就像find这样做)该 glob。

相关内容