Nfs

如何重命名帶有奇怪字元的文件

  • February 19, 2016

我有希臘或西里爾字元的文件。

它不歸我所有,而是歸網路伺服器使用者 (www) 所有。

我不能將 shell 用作 Web 伺服器使用者 (www) 或 root,但我使用了一個腳本(由 Web 伺服器使用者執行)將它所在的 modbits 目錄設置為 777,將文件本身設置為 666。

我無法重命名(或刪除此)文件。即使使用 inode 和 usingfind失敗:

$ ls -i1
19120017 Idezbox - коробка.jpeg

$ find . -inum 19120017 -exec mv -i {} sane \;
mv: cannot move `./Idezbox - коробка.jpeg' to `sane': No such file or directory

萬用字元失敗:

$ mv Idezbox*.jpeg sane
mv: cannot move `Idezbox - коробка.jpeg' to `sane': No such file or directory

以下 Perl 腳本也失敗了:

find . -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/x/g) {
 print("Renaming $_ to $new\n");
 rename($_, $new);
}'

它列印出來:

Renaming Idezbox - коробка.jpeg to Idezbox - xxxxxxxxxxxxxx.jpeg

但隨後的重命名命令無效。

但是,請注意有 7 個希臘字元和 14 個“x”-es。

移動到上面的目錄並嘗試刪除“垃圾”:

$ rm -riv Junk
rm: descend into directory `Junk'? yes
rm: cannot remove `Junk/Idezbox - коробка.jpeg': No such file or directory

一些請求的輸出:

$ mount | grep "on /ifi/asgard/k00"
asgard:/ifi/asgard/k00 on /ifi/asgard/k00 type nfs (rw,tcp,rsize=32768,wsize=32768,hard,intr,addr=xxx.xxx.xxx.xxx)

$ df .
Filesystem           1K-blocks      Used Available Use% Mounted on
asgard:/ifi/asgard/k00
                    104857600  53201568  51656032  51% /ifi/asgard/k00
$ ls -al
total 88
drwxrwxrwx  2 www     ifiweb   4096 2014-08-11 14:16 .
drwxrwsrwx 14 inf5270 inf5270  4096 2014-08-11 14:15 ..
-rw-rw-rw-  1 www     ifiweb  35176 2012-04-14 13:38 Idezbox - коробка.jpeg
-rwxrw-r--  1 gisle   ifi-a     139 2014-08-11 14:15 perl-rename.sh

$ who ami i
gisle    pts/122      2014-08-11 11:37 (safir.ifi.uio.no:13.0)

在閱讀了所有評論和答案後(謝謝大家!)我不再認為這只是轉義或引用西里爾字元。我需要研究 NFS 的角度。

編輯 2015-10-02:

這個問題原來是與 NFS 相關的。由於該文件是直接在我從另一台電腦訪問的 NFS 安裝卷上創建的,因此沒有任何效果。以 root 身份直接登錄伺服器允許系統管理員(我只是這個特定係統上的使用者,不能這樣做)刪除文件(使用一些標準方法來轉義希臘字元)。感謝G-Man讓我走上正軌(在評論中)。如果G-Man還在,並將他的評論轉化為答案,我會接受。

我知道這很舊,但如果你想用奇怪的字元重命名一個文件,你可以使用:

find . -inum INODE -exec rename {} NEW_NAME \;

因此,在這種情況下,您可以使用:

find . inum 19120017 -exec rename {} sane \;

不考慮NFS問題的一部分,幾天前我在嘗試刪除沒有名稱/空白名稱的文件時遇到了類似的問題。嗯,實際上,它不是空白的——它的名字是end of transmission字元 ( \004) 的八進制程式碼。它是如何在那裡創建的,不知道。但是,我刪除它的方法是刪除它echo的文件名,然後將其傳遞xargsrm命令。

  1. 首先,我通過執行獲得了真實姓名
ls -lb

這將顯示目錄中文件的八進制名稱。在這種情況下,\004。 2. 然後,我跑了這樣的事情:

echo "\004" | xargs rm 

那是我的解決方法——也許你可以嘗試類似上面的方法,但是使用Idezbox - коробка.jpeg八進制的整個文件名()。

引用自:https://unix.stackexchange.com/questions/149656