我为此搜索过,但条款显然过于笼统。我正在编写脚本来搜索.mp3文件的一组文件夹。有些文件夹没有mp3,所以必须将它们排除在外。
我创建了一个数组来保存uniq&#d; d文件夹名称。这个find命令将获取我需要的文件夹。
Folders=$(sudo find /my/music/ -type f -name "*.mp3" | cut -d'/' -f7 | sort -u)
当我尝试计算数组中的文件夹数量时,我总是得到1
echo ${#Folders[@]}
echo ${Folders[@]}
将它们打印在不同的行上,因此我认为它们是独立的数组元素。谁能解释一下发生了什么?您可能必须在cut命令中抖动字段编号以在本地重现。
答案 0 :(得分:4)
Folders
不是数组而是变量。
你需要:
Folders=( $(sudo find /my/music/ -type f -name "*.mp3" | cut -d'/' -f7 | sort -u) )
即。用()
括起命令替换。现在${#Folders[@]}
会为您提供数组Folders
的元素数量。
答案 1 :(得分:0)
或者做:
sudo find /my/music/ -type f -name "*.mp3" | cut -d'/' -f7 | sort -u | wc -l
注意强>
wc -l
打印行数,在这种情况下是唯一文件的数量-printf "%p\n"
中使用find
选项,其中%p
说明符以完整路径打印文件。答案 2 :(得分:0)
假设{string[2]}
[0]: "Abc"
[1]: "123PQR"
4或更高版本,请勿在此使用bash
;使用find
运算符。
globstar
另外假设shopt -s globstar
folders=( /my/music/**/*.mp3 )
应该单独提取文件名,请按照
cut -d/ -f7
填充数组的其他方法必须更加谨慎地容纳包含空格或folders=${folders[@]##*/}
,?
或*
等字符的文件。包含换行符(罕见但非非法)的文件名更难以正确处理。路径名扩展是在shell内部完成的,因此您不必担心任何此类特殊字符。