我有一个包含名称列表的文件:
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
,因此我们存储$names
在name-list.txt
j[|]
:用 with 连接数组的元素|
~
将其|
视为全局运算符(此处用于交替)而不是文字|
。**/
:递归通配符(在任何级别的子目录中搜索)。(D)
: glob 限定符,启用dotglob
(包括隐藏文件并在隐藏目录中进行搜索,就像find
这样做)该 glob。