Verzeichnisse suchen, in denen Dateien explizit Escape-Zeichen enthalten, wie], - Alle Leerzeichen

299
Linuxwhisperer

Ich habe mehrere Videodateien, die Escape-Zeichen wie [in Kombination mit [1920x1080] enthalten. Wenn ich ausführen:

find /run/media/user/usbdisk -type f -iname [HD, 1920x1080] - Wild Wild West.mp4 -ls 

dann erhalte ich eine Fehlermeldung wie diese:

find:paths must precede expression 

Wenn ich ausführen

find /run/media/user/usbdisk -type f -iname "[HD, 1920x1080] - Wild Wild West.mp4" -ls 

Ich bekomme KEIN Ergebnis, obwohl ich sicher bin, dass die Datei existiert.

Gleiches Ergebnis (nichts gefunden) beim Ausführen:

find /run/media/user/usbdisk -type f -iname '[HD, 1920x1080] - Wild Wild West.mp4' -ls 

Um den Verzeichnisnamen (Basisnamen) meines Films zu erhalten, habe ich den Namen in einer Variablen namens video gespeichert, so dass mein Befehl schließlich so aussieht:

dname=$(find /run/media/user/usbdisk -type f -iname "$video" -exec dirname {} \;) 

Dies führt jedoch zu einem Fehlerergebnis (siehe oben).

Wie kann ich den Befehl finden lassen (oder irgendetwas anderes), um genau meine benannte Datei einschließlich Escape-Zeichen zu finden? Gibt es eine Möglichkeit oder müssen die Fluchtzeichen in den Dateinamen ersetzt werden? Ich möchte das verhindern. Danke im Voraus.

0
Haben Sie versucht, diesen Fluchtfiguren zu entkommen? Zumindest ist dies als Lösung für [So finden Sie Dateien anhand von Namen, die Klammern enthalten?] (Https://stackoverflow.com/questions/15928827/how-to-find-filesby-names-which-contains-brackets) enthalten ). Wenn Sie ein übereinstimmendes Muster verwenden, müssen Sie wahrscheinlich diesen Zeichen entkommen. Seth vor 6 Jahren 0

1 Antwort auf die Frage

1
Kamil Maciorowski

-inamewertet ihr Argument, *, ?und []hat eine besondere Bedeutung zu, so dass Sie sie entkommen, wenn Sie wollen, buchstäblich passieren.

Verwenden -quitSie auch die Verwendung, falls Sie ansonsten zwei oder mehr Dateien in verschiedenen Ordnern finden (Duplikate?). Ich nehme an, Sie erwarten dnameeinen einzigen Verzeichnisnamen.

Ich verstehe $videoschon gegeben:

video="[HD, 1920x1080] - Wild Wild West.mp4" 

In diesem Fall versuchen Sie:

video1=$(echo $video | sed 's|\[|\\[|g; s|\]|\\]|g') dname=$(find /run/media/user/usbdisk -type f -iname "$video1" -exec dirname {} \; -quit) 

Dies kann in einer Zeile erfolgen. Ich habe mich entschieden, zur besseren Übersicht zusätzliche Variablen einzuführen.

Danke erstmal. Der Punkt ist, die (Film-) Namen sind fest vorgegeben. Ich kann kein \ hinzufügen, um Escape-Sonderzeichen zu übergeben. Ich möchte einfach den Inhalt einer Variablen (hier $ video) übergeben, egal was darin enthalten ist. Und ja, $ dname sollte den Namen des Verzeichnisses enthalten, in dem das Video gefunden wird. Linuxwhisperer vor 6 Jahren 0
@Linuxwhisperer Ich habe meine Antwort an Ihre Bedürfnisse angepasst. Kamil Maciorowski vor 6 Jahren 0
Ich habe es versucht - kein Ergebnis ... Linuxwhisperer vor 6 Jahren 0
@Linuxwhisperer Es funktioniert in meinem Kubuntu. Nur um sicher zu gehen: Sie haben nicht erwartet, dass `dname =…` etwas zurückgibt, Sie haben `echo $ dname` nachgesehen, oder? Kannst du mir ein Feedback geben? (z. B. "es funktioniert mit einem solchen Dateinamen, aber nicht mit ..." oder "` video1` scheint nicht richtig zu sein, weil ... "). Kamil Maciorowski vor 6 Jahren 0
Entschuldige die späte Antwort. Ich musste es noch einmal versuchen, kopieren und einfügen und adoptieren ... Nun scheint Ihr Weg zu funktionieren. Ich werde jetzt mehr Tests in meinen Skripten machen. Danke noch einmal! Linuxwhisperer vor 6 Jahren 0
@Linuxwhisperer Um die Wahrheit zu sagen, gab es einen Fehler in der Zeile "video1 = ...". Ich habe ihn gleich nach der Veröffentlichung behoben. Sie müssen schnell genug gewesen sein, um die fehlerhafte Version zu kopieren. Das tut mir leid. Kamil Maciorowski vor 6 Jahren 0