例如,report jpg 将显示所有名为 something.jpg 的文件。这是我正在处理的代码,包括我的问题。
function report {
x=`ls *.$1`
num=`ls *.$1 | wc -l`
# Question 1:
# Want to use variable for x to get
# num, but num=$($x | wc -l) didn't work for this purpose.
echo There are $num $1 files
if [ $num -lt 10 ]; then
# Question 2:
# for this part, I want to use "find . -name '*.$1'
# with delimiter . to extract filename from its extension
# and display them (Also maybe need to use while or for loop)
fi
}
report jpg
report html
具体回答您的问题:
Q1。该表达式的
$x | wc -l
意思是“运行命令$x
并将结果传递给wc -l
”。要通过管道传输 to的内容,您可以使用或(在此处使用 bash字符串)。$x
wc
num=`echo "$x" | wc -l`
num=`wc -l <<< "$x"`
然而,命令替换的“反引号”形式已被弃用 - 最好养成使用
$( ... )
ie的习惯请注意,如果任何文件名包含换行符(在 Linux 中是允许的),这将给出错误的计数。
Q2。在
find . -name '*.$1'
中,周围的单引号(又名“硬引号”)'*.$1'
将阻止扩展,$1
因此find
将搜索以 . 字面结尾的文件名$1
。要允许扩展$1
同时防止过早扩展*.
,请使用双引号(也称为“软引号”),即"*.$1"
您可能希望将搜索限制在顶级目录而不是下降到子目录(否则结果将与从 获得的计数不一致
wc
):但是,这是我的做法 - 假设有一个
bash
外壳:这避免了Bash Pitfall #1(解析输出
ls
而不是使用 shell glob)并使用 shell 的set
内置函数将匹配的文件名读入$@
位置参数数组。这样,您可以$#
明确地计算文件的数量(即使它们包含换行符 - 管道ls
会wc
给出错误的计数),并且无需使用单独的find
命令来重新获取匹配的名称。如果您想显示不带扩展名的文件名,您可以替换
$@
inprintf
使用参数扩展从数组的每个元素中${@%.*}
删除最短的尾随子字符串匹配。.*
尽管我选择使用
(( ... ))
算术构造来测试文件的数量,但使用 POSIX[ $# -le 10 ]
或者[ $# -lt 10 ]
如果您愿意,也没有任何问题。额外的$# > 0
测试只是为了在没有给定扩展名的文件时保持输出漂亮。您可以通过使用扩展数组轻松扩展函数以接受多个扩展:
示例用法:
用法:./script.sh jpg