2016-07-26 13 views
1

Ich suchte überall hin, aber die Begriffe sind anscheinend zu allgemein. Ich schreibe ein Skript, um eine Gruppe von Ordnern nach MP3-Dateien zu durchsuchen. Einige Ordner haben keine MP3s, daher müssen sie ausgeschlossen werden.Bash-Array-Zahl gibt immer 1

Ich erstellte ein Array, um die uniq'd Ordnernamen zu halten. Dieser Suchbefehl erhält die benötigten Ordner.

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

Wenn ich versuche, die Anzahl der Ordner in dem Array zu zählen, habe ich immer 1

echo ${#Folders[@]}

echo ${Folders[@]} druckt sie aus auf separaten Zeilen so dachte ich, dass sie getrennte Array-Elemente waren . Kann mir jemand erklären, was vor sich geht? Möglicherweise müssen Sie die Feldnummer im Schnittbefehl wackeln, um lokal zu reproduzieren.

+2

Wo haben Sie das Array erstellt? 'Folders = $ (...)' erstellt kein Array ... – twalberg

+0

Wenn Ihr Pfad Leerzeichen oder Glob-Zeichen enthalten kann, ist das Erstellen eines Arrays mit Befehlsersetzung nicht sicher. – anubhava

+0

@ twalberg - danke! Das war mein erstes Missverständnis. Und ich weiß es auch besser! – LHWizard

Antwort

4

Folders ist kein Array, sondern eine Variable.

Sie benötigen:

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

das heißt den Befehl Substitution umschließen mit (). Jetzt würde ${#Folders[@]} Ihnen die Anzahl der Elemente des Arrays Folders geben.

0

Oder:

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

Hinweis

  • wc -l druckt die Anzahl der Zeilen, die in diesem Fall würde die Anzahl der eindeutigen Dateien sein
  • Dinge zu machen, ein bisschen mehr explizite Verwenden Sie -printf "%p\n" Option mit find wo %p Specifier druckt die Datei mit vollständigen Pfad.
0

Angenommen bash 4 oder später, verwenden Sie nicht find hier; Verwenden Sie den Operator globstar.

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

auch davon aus, dass cut -d/ -f7 die Dateinamen allein extrahieren soll, dies mit

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

Anderen Verfahren zum Füllen der Anordnung folgen muß mehr darauf achten, Dateien mit Leerzeichen oder Zeichen wie ? zu empfangen, * oder [. Dateinamen mit Zeilenumbrüchen (selten, aber nicht illegal) sind viel schwieriger zu handhaben. Die Erweiterung des Pfadnamens erfolgt innerhalb der Shell, sodass Sie sich keine Gedanken über solche Sonderzeichen machen müssen.