2016-10-26 2 views
2

Ich habe einige Probleme, eckigen Klammern in jedem Dateinamen zu entkommen.Wie eckige Klammern in einem ls-Ausgang zu entkommen

Ich muss zwei Listen vergleichen. Der ls-Ausgang ist die erste Liste und der zweite ist der ARQ02.

#!/bin/bash 

exec 3< <(ls /home/lint) 

while read arq <&3; do 
var=`grep -e "$arq" ARQ02` 
    if [ "$?" -ne 0 ] ; then 
    echo "$arq" >> result 
    fi 
done 

exec 3<&- 

Sorry für mein schlechtes Englisch.

+1

Was ist 'ARQ02'? es scheint mir eine Datei. Also sagst du nur, ob deine Dateien in bestimmten Ordnern zufällig eine Untermenge der Dateien sind, die in einer anderen Datei aufgelistet sind? Es gibt eine Reihe von häufigen Fehlern, die Sie hier in einem so kurzen Skript machen. – HuStmpHrrr

Antwort

2

Ihr unmittelbares Problem ist, dass Sie müssen grep anweisen, den Suchbegriff als wörtliche eher als ein regulärer Ausdruck zu interpretieren, mit der -F Option:

var=$(grep -Fe "$arq" ARQ02) 

Auf diese Weise jede Regex Metazeichen, die zufällig in der Ausgabe von ls /home/lint sind - wie [ und - werden immer noch als Literale behandelt und wird nicht die 01 brechenAufruf.

Das heißt, es sieht aus wie Ihr Befehl, wie durch rationalisiert werden, um die Ausgabe von ls /home/lintdirekt als die Menge der Suchzeichenfolgen mit bis grepsofort, passieren, mit der -f Option:

grep -Ff <(ls /home/lint) ARQ02 > result 

<(...) ist eine sogenannte process substitution, die, einfach ausgedrückt, präsentiert th e Ausgabe von einem Befehl, als wäre es eine (temporäre) Datei, die -f erwartet: eine Datei mit den Suchbegriffen für grep.


Wenn alternativ:

  • die Linien ARQ02 enthalten nur Dateinamen, die vollständig Spiel (einige) der Dateinamen in der Ausgabe von ls /home/lint und

  • Es stört Sie nicht Sortierung oder möchten die ingespeicherten Übereinstimmungen sortieren,

betrachten HuStmpHrrr's helpful answer.

2

ich muss davon ausgehen, dass meine Interpretation korrekt ist. darauf aufbauend kann ich mit einem oneliner problemlos ihre lösung lösen. es gibt 2 Annahme ich hier machen müssen: Ihr Dateiname nicht Wagenrücklauf enthält und Sie moderne bash verwenden:

comm -23 <(printf "%s\n" * | sort) <(sort ARQ02) 

in bash <() emittiert eine Subshell und Rohr die stdout als Datei. comm ist der Befehl zum Berechnen der Differenz von 2 Eingabestreams.

in Details zu erklären,

comm 
-23 # suppress files unique in ARQ02 and files in common 
<(printf "%s\n" * | # print all the files in local folder with new line breaker 
    sort) # sort them 
<(sort ARQ02) 

es notwendig ist, nur zu sortieren, wie comm inkrementell vergleichen.

Verwandte Themen