2016-10-13 5 views
1

Ich habe eine Datei, die eine Liste von Dateien enthält, und ich möchte wissen, ob diese Dateien existieren. Ich habe diesen Befehl ein:Bash - Datei Existenz funktioniert nicht

while read line; do 
    filename="$(echo $line | cut -d';' -f4)"; 
    if [ ! -e "/some/path/$filename" ]; 
    then echo "/some/path/$filename"; 
    fi ; 
done < "../my_list_of_file" 

Dieser Befehl zurückgeben mir jede Datei aufgelistet als nicht existent, ex:

/some/path/my_listed_file.jpg 

Aber wenn ich ls /some/path/my_listed_file.jpg tun, kann ich sehen, dass die Datei vorhanden ist. Was ist falsch an meinem Befehl?

+4

Ist dies das letzte Feld auf der Linie? Ich vermute, dass Ihre Datei CRLF-Zeilenendungen hat, weil sie unter Windows erstellt wurde. – Barmar

+1

Wenn 'filename' das letzte Feld in jeder Zeile ist, zeigt dies auf' my_list_of_file' mit DOS-Zeilenenden. Der Dateiname endet tatsächlich mit einem Wagenrücklauf. – chepner

+0

Wenn dies das Problem ist, verwenden Sie 'dos2unix', um die Datei zu reparieren. – Barmar

Antwort

1

Vielen Dank an Barmar und chepner, das Problem war die CRLF am Ende der Datei. Hier ist der Arbeitsbefehl:

while IFS=$';\r' read -r _ _ _ filename _; do 
    if [ ! -e "/some/path/$filename" ]; 
    then echo "/some/path/$filename"; 
    fi ; 
done < "../my_list_of_file" 
Verwandte Themen