如何使用 find、ls 命令根据数组中的条目显示文件名?
How to use find, ls commands to display file names based on entries in an array?
我有一个数组,其中包含可能存在于目录中的 wildcards/filenames。如何显示目录中的文件,其名称与数组中的名称匹配。顺便说一句,如果可能的话,不使用for循环。
例如:
find ./ -maxdepth 1 -type f -name $FILE_ARR[@]
ls $FILE_ARR[@]
访问数组时正确的语法是使用花括号:
ls ${file_array[@]}
对于find
,它有点复杂,因为-name
只接受一个参数,而不是多个。
find . -maxdepth 1 -name $(echo ${file_array[@]}| sed 's/ / -o -name /g')
请注意,如果任何路径包含空格,它将不起作用。
前提是文件名模式不包含白色space:
echo ${arr[@]}|fmt -w 1|xargs -i -r -n 1 find ./ -maxdepth 1 -type f -name
fmt
将输入分成单独的行,xargs
将模式分发给单独的查找命令。
不过,我认为显式循环更易于阅读且更可靠。
对于 find
这是一个处理任意文件名和 find
的其他选项的解决方案
#!/bin/bash
# dummy -name patterns for find
file_array=(
*.jpg
*.png
)
# construct find options array
find_options=( \( )
for ((i=0; i<${#file_array}; i++)); do
[[ $i -gt 0 ]] && find_options+=( -o )
find_options+=( -name "${file_array[$i]}" )
done
find_options+=( \) )
find . -maxdepth 1 "${find_options[@]}"
我有一个数组,其中包含可能存在于目录中的 wildcards/filenames。如何显示目录中的文件,其名称与数组中的名称匹配。顺便说一句,如果可能的话,不使用for循环。
例如:
find ./ -maxdepth 1 -type f -name $FILE_ARR[@]
ls $FILE_ARR[@]
访问数组时正确的语法是使用花括号:
ls ${file_array[@]}
对于find
,它有点复杂,因为-name
只接受一个参数,而不是多个。
find . -maxdepth 1 -name $(echo ${file_array[@]}| sed 's/ / -o -name /g')
请注意,如果任何路径包含空格,它将不起作用。
前提是文件名模式不包含白色space:
echo ${arr[@]}|fmt -w 1|xargs -i -r -n 1 find ./ -maxdepth 1 -type f -name
fmt
将输入分成单独的行,xargs
将模式分发给单独的查找命令。
不过,我认为显式循环更易于阅读且更可靠。
对于 find
这是一个处理任意文件名和 find
#!/bin/bash
# dummy -name patterns for find
file_array=(
*.jpg
*.png
)
# construct find options array
find_options=( \( )
for ((i=0; i<${#file_array}; i++)); do
[[ $i -gt 0 ]] && find_options+=( -o )
find_options+=( -name "${file_array[$i]}" )
done
find_options+=( \) )
find . -maxdepth 1 "${find_options[@]}"