So finden Sie Dateien, die keinen eigenen Dateinamen enthalten

360
Craig

Bei der Verwendung von Vorlagen zum Erzeugen von Dateien ist es wichtig, den Namen der Vorlage in die Vorlage aufzunehmen. Wenn Sie eine generierte Datei lesen, können Sie die zum Generieren der Vorlage verwendete Vorlage finden.

Ich möchte nach allen Vorlagen in einem Verzeichnis suchen, die keinen eigenen Dateinamen enthalten, die von mir gefundenen Vorlagen ausdrucken und mit einem von Null verschiedenen Code beenden, wenn einer gefunden wird.

Bisher habe ich mir das ausgedacht.

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

Dadurch werden die Dateien erfolgreich gefunden und gedruckt, es wird jedoch der Exit-Code 0 angezeigt, unabhängig davon, ob Dateien gefunden werden oder nicht. Wie kann ich die relevanten Dateien finden und mit einem Nicht-Null-Code beenden, wenn Dateien gefunden werden?

1

3 Antworten auf die Frage

1
Kamil Maciorowski

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

Pipe das Ergebnis an grep ''. Das Tool ändert den Textstrom nicht, generiert jedoch einen Beendigungsstatus 0oder 1abhängig davon, ob eine Zeile durch den Text fließt oder nicht.

Ich weiß, du willst es andersherum. Wenn ich Sie wäre, würde ich mich an das Verhalten von grepanpassen. Mein Grund ist: Sie möchten Dateien wissen, die Ihren Kriterien entsprechen. Der Befehl findet sie, sodass es erfolgreich ist, zu finden, ob mindestens eine Datei vorhanden ist.

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

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

Hinweis: Ich habe Ihren shAufruf im Inneren debuggt find. Ihr ursprünglicher Ansatz würde fehlschlagen, wenn er {}erweitert wird ./a;rm -rf ~;.xyz(dies ist in vielen Linux-Dateisystemen ein gültiger Dateiname).

0
rpax

Vielleicht macht so etwas grep .... && <do if found> || <do if not found>die Arbeit

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

Sie erhalten die Liste der Dateien, nach denen Sie suchen, obwohl sie immer noch eine Null zurückgibt (weil das Echo erfolgreich ist).