bash: legen Sie Liste der Dateien in eine variable und aber die Größe des Arrays ist 1
Ich bin mit einer Auflistung der Dateien in einem Verzeichnis Durchlaufen Sie okay, ABER ich muss wissen, wie viele es auch sind. ${#dirlist[@]} ist immer 1, aber die for-Schleife funktioniert?
#!/bin/bash
prefix="xxx"; # as example
len=${#prefix}; # string length
dirlist=`ls ${prefix}*.text`;
qty=${#dirlist[@]}; # sizeof array is always 1
for filelist in $dirlist
do
substring="${filelist:$len:-5}";
echo "${substring}/${qty}";
done
Ich habe Dateien xxx001.text bis zu xxx013.text
aber alles was ich bekomme ist 001/1 002/1 003/1
- verwenden
dirlist=($(ls ${prefix}*.text))
erstellen Sie ein array - Cheers Kev musste ich die Schleife für filelist in ${dirlist[@]}
- Sie gehörten zu den ersten, und gab mir was ich brauchte, können Sie senden eine Antwort bitte
- als David Ongaro, kommentierte in einer der Antworten, verwenden Sie
dirlist=(${prefix}*.text)
, ein array zu erstellen. Es handle Dateinamen mit Leerzeichen erfolgreich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
nicht um ein array, es macht einen nur eine Zeichenfolge mit Leerzeichen getrennten Dateinamen.
haben Sie zu tun
machen es ein array.
Dann $dirlist wird nur als Verweis auf das erste element, die Sie verwenden müssen,
Referenz alle in der Schleife.
"${dirlist[@]}"
statt${dirlist[*]}
zum Schutz vor Dateien, deren Namen Leerzeichen enthalten.ls
!dirlist=(${prefix}*.text)
ist einfacher und weniger fehleranfällig.ls
ist einfach nur überflüssig, da die shell ist schon dabei der ausbau der${prefix}*.text
diels
sehen als Parameter. Im schlimmsten Fallls
wird die Ausgabe zusätzlicher Informationen (wie ANSI color codes, filtetype Suffixe) abhängig von der Umgebung, also das Skript bricht. Ich denke, diese Gewohnheit aus mitls
vor einen glob Ausdruck stammt aus einem dos - /windows-Mentalität, wodir
war dabei die Erweiterung, aber nicht die shell.Sind Sie nicht zum erstellen einer array-es sei denn, Sie umgeben Sie es mit
(
)
:Durchlaufen array mit einem Zähler