2016-07-26 42 views
1

我搜索了这个,但条款显然过于笼统。我正在编写一个脚本来搜索一组.mp3文件的文件夹。有些文件夹没有mp3,所以必须排除它们。bash数组总是返回1

我创建了一个数组来保存uniq'd文件夹名称。这个查找命令将得到我需要的文件夹。

Folders=$(sudo find /my/music/ -type f -name "*.mp3" | cut -d'/' -f7 | sort -u)

当我尝试计数数组中的文件夹的数量,我总是得到1

echo ${#Folders[@]}

echo ${Folders[@]}打印出来放在单独的行,所以我以为他们是独立的数组元素。任何人都可以解释发生了什么?您可能必须在切割命令中晃动字段编号才能在本地重现。

+2

你在哪里创建数组? 'Folders = $(...)'不会创建一个数组... – twalberg

+0

如果你的路径可以包含空格或者glob字符,那么使用命令替换创建数组是不安全的。 – anubhava

+0

@twalberg - 谢谢!那是我第一次误会。我也知道得更好! – LHWizard

回答

4

Folders不是数组而是变量。

您需要:

Folders=($(sudo find /my/music/ -type f -name "*.mp3" | cut -d'/' -f7 | sort -u)) 

即与()请将命令替换。现在${#Folders[@]}会给你数组Folders的元素数量。

0

或做:

sudo find /my/music/ -type f -name "*.mp3" | cut -d'/' -f7 | sort -u | wc -l 

注意

  • wc -l打印在这种情况下将是唯一的文件数
  • 使事情变得更加明确一点的行数,使用-printf "%p\n"选项与find其中%p说明符以完整路径打印文件。
0

假设bash 4或更高版本,在这里不要使用find;使用globstar运算符。

shopt -s globstar 
folders=(/my/music/**/*.mp3) 

而且假设cut -d/ -f7应该单独提取文件名,与

folders=${folders[@]##*/} 

其他方法跟进用于填充数组必须多加小心,以适应包含空格或字符的文件,如?*[。包含换行符的文件名(罕见,但不是非法)更难以正确处理。路径名扩展是在shell内完成的,所以你不必担心任何这种特殊字符。