2016-06-21 13 views
0

Mein Ziel ist es, einen Pfad an meinen Dateinamen anzuhängen. Ich kann über einen Ordner iterieren und den Dateinamen erhalten, wenn ich den Pfad nicht angehängt habe. Meine Herausforderung ist, wenn ich den Pfad echo fileName hinzufügen mein regulärer Ausdruck funktioniert nicht mehr und ich bekomme "/home/erikrasmussen/Desktop/Script/realLargeMetaBatBinscontigs.fa.metabat-bins-*" wo der reguläre Ausdruck '*' wie a behandelt wird Zeichenfolge. Wie kann ich den Pfad und den vollständigen Dateinamen erhalten, während ich über einen Ordner mit Dateien iteriere?Iterieren über das Verzeichnis mit dem angegebenen Pfad in Bash

Antwort

1

Obwohl ich nicht wirklich wissen, wie Sie Ihre Dateien auf Ihrer Festplatte angeordnet sind, deutet darauf hin, ein flüchtiger Blick auf "/home/erikrasmussen/Desktop/Script/realLargeMetaBatBinscontigs.fa.metabat-bins-*", dass es ein / vor contigs fehlt. Wenn das der Fall ist, dann sollten Sie Ihre Definition von Bins ändern: Allerdings

bins="${pathToBins}/contigs.fa.metabat-bins-*" 

, es ist viel robuster bash-Arrays, anstatt sich auf Dateinamen verwenden, um keine Leerzeichen und Meta-Zeichen enthalten. So würde ich vorschlagen:

bins=(${pathToBins}/contigs.fa.metabat-bins-*) 
for fileName in "${bins[@]}" 
do 
    echo "$fileName" 
done 

Bash normalerweise kein Muster erweitern, die keine Datei übereinstimmt, so dass in diesem Fall, dass Sie das ursprüngliche Muster sehen. Wenn Sie die Array-Formulierung oben verwenden, können Sie die Bash-Option nullglob setzen, wodurch das nicht angepasste Muster stattdessen verschwindet und ein leeres Array zurückbleibt.

+0

Jeder Vorteil der Array-Notation gegenüber: 'für Dateiname in" $ {pathToBins} "/ contigs.fa.metabat-bins- *; echo "$ fileName"; fertig? Wenn das Array später benötigt wird, ist es einfacher, es einmal zu speichern. Wenn die Informationen jedoch einmal verwendet werden, müssen sie nicht unbedingt im Array gespeichert werden. (Ich stimme zu, dass Arrays häufiger verwendet werden sollten als sie sind.) –

+0

@JonathanLeffler: Ich stimme zu, wenn 'Bins' nicht wiederverwendet werden, hat es keinen Sinn, es zu erstellen. Ich habe gerade versucht, eine Parallele zum OP zu halten, in der "Bins" absichtlich erzeugt werden, aber als String und nicht als Array. Ich habe (vielleicht fälschlicherweise) angenommen, dass die Frage ein Snippet ist und dass "Bins" mehr als einmal im endgültigen Skript verwendet werden. – rici

Verwandte Themen