2016-03-19 3 views
0

Ich führe gerade ein Skript (check_files.sh), das match1 Dateien erzeugen kann oder nicht (zB match1.txt, match2.txt, etc.) gehen Sie auf einen R-Skript auf dem erzeugten Spiel * Dateien auszuführen.Alternative Methode in Bash, um zu überprüfen, ob die Datei vorhanden ist

Doch bevor ich den R-Skript ausführen, ich eine Linie in meinem Skript versucht habe, die überprüft, ob die Dateien vorhanden sind.

if [ -s match* ] 
      then 
      for f in match* 
      do 
       Rscript --vanilla format_matches.R ${f} 
       rm match* 
      done 
else 
      echo "No matches present" 
fi 

Ich bekomme jedoch immer eine Fehlermeldung (da oft viele Match-Dateien erzeugt werden):

./check_files.sh: line 52: [: too many arguments 

Gibt es eine Alternative zu [-s match *], die die Fehlermeldung nicht auslösen würde? Ich nehme an, dass die Fehlermeldung erscheint, da mehrere Match * -Dateien erzeugt werden.

Antwort

2

Wenn Sie Dateinamen mit Leerzeichen erwarten, das ist ein bisschen hässlich, aber robust:

found=0 
find -maxdepth 1 -type f -name 'match*' -print0 | while IFS= read -rd $'\0' f 
do 
    found=1 
    Rscript --vanilla format_matches.R "$f" 
    rm "$f" 
done 

if [ "$found" -eq 0 ]; then 
    >&2 echo "No matches present" 
fi 
+0

Das wird nicht funktionieren, wenn die Dateinamen Zeilenumbrüche oder Backslash enthalten. Überlegen Sie, 'find ... -exec bash -c" script "' form zu verwenden, anstatt die Ausgabe von 'find' zu übergeben. – kojiro

+0

Backslashes und Zeilenumbrüche für Dateinamen? Ernsthafte Frage, ist das jemals passiert? – xvan

+0

Ja. Dateinamen sind Benutzereingaben für dieses Programm. Vertrauen Sie nicht Benutzereingaben. – kojiro

2

Sie könnten Ihre Logik wie folgt ändern:

found=0 
for f in match*; do 
    [ -e "$f" ] || continue 
    found=1 
    Rscript --vanilla format_matches.R "$f" 
    rm "$f" 
done 

if [ "$found" -eq 0 ]; then 
    >&2 echo "No matches present" 
fi 
+0

Dies funktioniert wie l weil es keine Leerzeichen in den Dateinamen gibt. – xvan

+0

Ich habe das versucht, aber gelegentlich, wo keine Übereinstimmung * Dateien produziert werden, erhalte ich diesen Fehler: 'Datei kann nicht geöffnet werden 'Übereinstimmungen *': Keine solche Datei oder Verzeichnis' – IcedCoffee

+0

Dies ist falsch, weil' match * 'expandiert zu' match * '(die Identität), wenn keine passenden Dateien vorhanden sind. Somit würde die Schleife trotzdem ausgeführt werden. Die 'Nullglob'-Bash-Erweiterung wäre eine Möglichkeit, dies zum Funktionieren zu bringen. Alternativ könnte auch getestet werden, ob die übereinstimmende Datei in der Schleife vorhanden ist. – kojiro

0

Is there an alternative to [ -s match* ] which would not throw up the error message?

Folgende Arbeiten für meine Beispieldatei match1.txt

if [ -f ~/match* ]; then 
    echo "yeha" 
fi 
Verwandte Themen