So finden Sie Dateien, die keinen eigenen Dateinamen enthalten

So finden Sie Dateien, die keinen eigenen Dateinamen enthalten

Wenn Sie zum Generieren von Dateien Vorlagen verwenden, ist es wichtig, den Namen der Vorlage in die Vorlage aufzunehmen. Beim Lesen einer generierten Datei können Sie so leichter die Vorlage finden, die zum Generieren verwendet wurde.

Ich möchte in einem Verzeichnis nach allen Vorlagen suchen, die keinen eigenen Dateinamen enthalten, die gefundenen Vorlagen drucken und mit einem Code ungleich Null beenden, wenn welche gefunden werden.

Das ist, was mir bisher eingefallen ist.

find . -name "*.xyz" -exec sh -c 'grep -L $(basename {}) {}' \;

Dadurch werden die Dateien erfolgreich gefunden und gedruckt, aber es wird mit einem Exit-Code von 0 beendet, unabhängig davon, ob Dateien gefunden werden oder nicht. Wie kann ich die relevanten Dateien finden und mit einem Code ungleich 0 beenden, wenn welche gefunden werden?

Antwort1

Wie kann ich die relevanten Dateien finden und mit einem Code ungleich Null beenden, wenn welche gefunden werden?

Leiten Sie das Ergebnis an weiter grep ''. Das Tool ändert den Textstrom nicht, generiert jedoch einen Beendigungsstatus 0oder , 1je nachdem, ob eine Zeile ihn durchläuft oder nicht.

Ich weiß, dass Sie es anders wollen. Wenn ich Sie wäre, würde ich mich grepjedoch an das Verhalten von anpassen. Meine Begründung lautet: Sie möchten Dateien kennen, die Ihren Kriterien entsprechen; der Befehl findet sie, alsogelingt esbeim Herausfinden, ob mindestens eine Datei vorhanden ist.

Wenn Sie jedoch auf dem gegenteiligen Verhalten bestehen,den Exit-Status negieren. Beispiel:

! find . -name "*.xyz" -exec sh -c 'grep -L "$(basename "$1")" "$1"' sh {} \; | grep ''

shBeachten Sie, dass ich Ihren Aufruf darin debuggt habe find. Ihr ursprünglicher Ansatz würde nach hinten losgehen, wenn {}er auf erweitert würde ./a;rm -rf ~;.xyz(es ist ein gültiger Dateiname in vielen Linux-Dateisystemen).

Antwort2

Vielleicht grep .... && <do if found> || <do if not found>funktioniert so etwas wie

Antwort3

for f in *.xyz; do
    grep -q $f $f || echo "$f does not contain itself"
done

Sie erhalten die Liste mit den gesuchten Dateien, allerdings wird trotzdem eine Null zurückgegeben (weil das Echo erfolgreich ist).

verwandte Informationen