Beim Ausschluss einer Datei aus UNIX werden Ergebnisse basierend auf dem Vorhandensein einer anderen Datei gefunden

380
aendrew

Ich habe viele Verzeichnisse mit jeweils einer Reihe von PDF-Dateien. Einige dieser Dateien wurden erfolgreich in .csv konvertiert, andere nicht. Eine Beispielverzeichnisliste mit find ./:

./test5.pdf.csv ./test6.pdf ./test1.pdf.csv ./test3.pdf ./test1.pdf ./test3.pdf.csv ./test4.pdf.csv ./test7.pdf ./test2.pdf ./test5.pdf ./test4.pdf ./test2.pdf.csv ./test8.pdf 

Wie kann ich eine Liste der Dateien zurückgeben, die nicht erfolgreich konvertiert wurden?

Mit anderen Worten, welche Dateien haben kein .csv.pdf-Pendant?

In diesem Beispiel wäre es test .pdf.

1

2 Antworten auf die Frage

5
cxcv

So geht's mit find:

find . -name "*.pdf" | while read F; do test -f "$.csv" || echo "$F"; done 

Die Verwendung von find ist dem Shell-Globbing vorzuziehen, da die Anzahl der Argumente nicht beschränkt ist und Leerzeichen und Sonderzeichen verwendet werden.

Rad, das ist genau das, wonach ich gesucht habe. Habe es gerade getestet, funktioniert super! aendrew vor 10 Jahren 0
3
GnP

Ich konnte keinen Weg finden, finddirekt damit umzugehen, aber es ist sehr einfach, eine for-Schleife zu verwenden:

for file in *.pdf; do [ -f $.csv ] || echo $file; done 

Wenn Sie es im obersten Verzeichnis ausführen müssen, um es erneut aufzurufen, können Sie find wie folgt verwenden:

for file in $(find . -iname '*.pdf'); do [ -f $.csv ] || echo $file; done 

was würde so etwas ausgeben:

./dir2/test7.pdf ./dir2/test6.pdf ./dir2/test8.pdf ./dir3/test7.pdf ./dir3/test6.pdf ./dir3/test8.pdf ./dir1/test7.pdf ./dir1/test6.pdf ./dir1/test8.pdf 

Wenn Sie sich jedoch nicht sicher sind, ob sich in den Dateinamen der Eingabedateien seltsame Zeichen befinden, stellen Sie sicher, dass Sie die IFS- Umgebungsvariable entsprechend festlegen:

OFS=$IFS export IFS=$'\n' 

Natürlich wird es ab jetzt nur noch schlimmer.

Ich gehe davon aus, dass Sie bash verwenden.

Dies ist eine großartige, detaillierte Antwort, wenn Sie eine weniger als herausragende Version von "find" haben (ich denke, es ist ein bisschen anders bei Solaris) oder nicht wie "find" - Ich habe die andere Antwort akzeptiert, weil sie näher ist meine erste Frage, aber auch diese ist ziemlich großartig. Ich wünschte, ich könnte beide akzeptieren! aendrew vor 10 Jahren 0