2016-07-26 46 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內完成的,所以你不必擔心任何這種特殊字符。