find und rsync verschlucken sich beide an einer seltsam benannten Datei

7

Dies ist für mich kein wichtiges Problem, aber ich fand rsync und find ziemlich robust. Ich war überrascht, als rsync an einer Datei erstickte und find es dann auch tat. ls -lzeigt, dass die Datei 6093 Bytes hat (und dies ist die einzige Datei in diesem Verzeichnis, die dies tut, also habe ich dies getan, nachdem ich in dieses Verzeichnis geschrieben habe):

# find . -size 6093c
./????????????????????????:??????????????????????????????????????????
find: './\353\266\204\353\245\230:\353\257\270\352\265\255\354\235\230_\355\205\224\353\240\210\353\271\204\354\240\204_\352\262\214\354\236\204_\354\207\274': No such file or directory

Irgendeine Idee was das bedeutet? Seltsamerweise

# find . -size 6093c | xargs less

funktioniert gut. Hier ist was ich sehe:

# ls -lat | fgrep "6093 "
ls: cannot access ''$'\353\266\204\353\245\230'':'$'\353\257\270\352\265\255\354\235\230''_'$'\355\205\224\353\240\210\353\271\204\354\240\204''_'$'\352\262\214\354\236\204''_'$'\354\207\274': No such file or directory
-rw-rw-r--. 1 nobody nobody   6093 Oct 23  2013 หมวà¸à¸«à¸¡à¸¹à¹:à¹à¸à¸¡à¹à¸à¸§à¹à¸­à¹à¸¡à¸£à¸´à¸à¸²

Es wird nur geringfügig besser, wenn ich die Ergebnisse auf weniger pfeife:

# ls -lat | fgrep "6093 " | less

ls: cannot access ''$'\353\266\204\353\245\230'':'$'\353\257\270\352\265\255\354\235\230''_'$'\355\205\224\353\240\210\353\271\204\354\240\204''_'$'\352\262\214\354\236\204''_'$'\354\207\274': No such file or directory
-rw-rw-r--. 1 nobody nobody   6093 Oct 23  2013 <E0><B8><AB><E0><B8><A1><E0><B8><A7><E0><B8><94><E0><B8><AB><E0><B8><A1><E0><B8><B9><E0><B9><88>:<E0><B9><80>
<E0><B8><81><E0><B8><A1><E0><B9><82><E0><B8><8A><E0><B8><A7><E0><B9><8C><E0><B8><AD><E0><B9><80><E0><B8><A1><E0><B8><A3><E0><B8><B4><E0><B8><81><E0><B8><B2>

Das gleiche Verzeichnis hat eine Datei, mit der selbst ich nicht umgehen kann, aber ich kann sie auflisten, da sie sozusagen als ältester Eintrag angezeigt wird:

# ls -lat | tail -1 | less
ls: cannot access ''$'\353\266\204\353\245\230'':'$'\353\257\270\352\265\255\354\235\230''_'$'\355\205\224\353\240\210\353\271\204\354\240\204''_'$'\352\262\214\354\236\204''_'$'\354\207\274': No such file or directory
-?????????? ? ?      ?           ?            ? <EB><B6><84><EB><A5><98>:<EB>
<AF><B8><EA><B5><AD><EC><9D><98>_<ED><85><94><EB><A0><88><EB><B9><84><EC><A0>
<84>_<EA><B2><8C><EC><9E><84>_<EC><87><BC>

Nicht besonders wichtig, aber neugierig.

EDIT: da diese frage sehr schnell auffallen muss, habe ich ein wenig "recherchiert" (was vielleicht ganz genau ist oder auch nicht). Ich konnte das Problem nicht ganz reproduzieren, aber:

  • Am oder um den 23. Oktober 2013 besuchte ich die wikidata.org-Seite zu American Game Shows. Zu dieser Zeit sah es so aus: https://www.wikidata.org/w/index.php?title=Q7213876&direction=prev&oldid=85645107

  • Ich bin dann einem oder mehreren der fremdsprachigen Links gefolgt.

  • Auf den fremden Links, denen ich folgte, verwendete ich https://en.wikipedia.org/wiki/DownThemAll ! um alle links herunterzuladen.

  • Dabei entstehen viele Dateinamen mit Sonderzeichen, und ich bin mir fast sicher, dass ich so an diese beiden seltsamen Dateien gekommen bin.

  • Wenn ich das heute mache, bekomme ich immer noch Dateinamen mit Sonderzeichen, aber nicht ganz die unten aufgeführten.

barrycarter
quelle
Was passiert, wenn Sie Gebietsschemas deaktivieren, dh ausführen LC_ALL=C find . -size 6093cund ähnliches?
Satō Katsura,
Mein LC_ALL ist bereits auf "C" gesetzt (ich hatte Probleme mit sortund dies war der einfachste Weg, sie zu lösen).
barrycarter
2
Dies stimmt nicht mit der oben genannten Ausgabe überein ls -lat | fgrep "6093 ".
Satō Katsura
Ich habe gerade "echo $ LC_ALL" und "C" zurückbekommen (ich benutze tcsh) und das ist, was ich bekomme. Soll ich einen Screenshot machen anstatt auszuschneiden und einzufügen?
barrycarter

Antworten:

1

Die seltsam benannte Datei könnte ein roter Hering sein. Ihre Werkzeuge führen mehrere Tricks aus, um Sie glauben zu lassen, etwas sei kaputt.

Der Dateiname ist in UTF-8 angegeben. Sie sollten also export LANG=en_US.UTF-8zulassen, dass Ihre Befehle den Dateinamen reibungslos verwenden. Führen Sie den localeBefehl ohne Argumente aus, um die aktuellen Umgebungsvariablen zu überprüfen.

Oder, wenn Sie darauf bestehen, das Gebietsschema "C" zu verwenden, verwenden Sie ls -bls, um Escape-Sequenzen anstelle von Fragezeichen zu drucken. Dann können Sie $'\353\266\204\…'als Argument in Bash verwenden.

Der findBefehl weigert sich feige, nicht-textuelle Zeichen in ein tty zu schreiben. Mit anderen Worten, findund find | catverhalten Sie sich anders, wenn letztere die Namen ohne Anführungszeichen schreiben. Deshalb find | xargsfunktioniert das in der Tat. Eine robustere Art des Schreibens besteht darin, find -print0 | xargs -0zu verhindern, dass mögliche Whitespace-Zeichen von xargs interpretiert werden.

Dies erklärt nicht das "Keine solche Datei oder kein solches Verzeichnis" - auf jeden Fall kann Ihr Dateisystem tatsächlich einen Fehler enthalten - aber es sollte Ihnen ermöglichen, Ihre Absicht in der Befehlszeile genauer anzugeben.

Anfangs hielt ich es nicht für relevant, aber ich habe die Gewohnheit, seltsame Dateinamen mit einem Präfix ./zu versehen, um zu verhindern, dass Befehle sie interpretieren. In der Seitenleiste wurde eine verwandte Frage "rsync: Doppelpunkt in Dateinamen" angezeigt, die möglicherweise die Ursache für Ihren rsync-Fehler ist.

Josh Lee
quelle