2017-10-27 3 views
2

ich zur Zeit Linux-Bash Scripting lerne:Linux: get spezifischen Bereich von Dateinamen

Ich habe Dateien in einem Ordner mit dem folgenden Dateinamen-Muster:

ABC01_-12ab_STRINGONE_logicMatches.txt 
DEF02_-12ab_STRINGTWO_logicMatches.txt 
JKL03_-12ab_STRINGTHREE_logicMatches.txt 

Ich möchte extrahieren STRINGONE, STRINGTWO und STRINGTHREE als Liste. Um zu sehen, ob meine Idee funktioniert, wollte ich mein Ergebnis zuerst auf bash wiedergeben.

-Code meiner Bash-Skript (im Ordner ausgeführt wird, wo sich die Dateien befinden):

#!/bin/bash 
for element in 'folder' do out='cut -d "_" -f2 $element | echo $out' done 

Tatsächliches Ergebnis:

error: unexpected end of file 

Wunschergebnis:

STRINGONE 
STRINGTWO 
STRINGTHREE 
(echoed in bash) 
+0

Sie vermissen eine Reihe von ';'. – melpomene

Antwort

2

Die Idee, die du machst, ist richtig. Aber die Syntax von Datei-Globbing (Suchen nach Textdateien) und Befehlssubstitution (Ausführen des Befehls) ist falsch. Sie müssen tun

for file in folder/*.txt; 
    # This condition handles the loop exit if no .txt files are found, and 
    # not throw errors 
    [ -f "$file" ] || continue 
    # The command-substitution syntax $(..) runs the command and returns the 
    # result out to the variable 'out' 
    out=$(cut -d "_" -f3 <<< "$file") 
    echo "$out" 
done