如何重命名帶有奇怪字元的文件
我有希臘或西里爾字元的文件。
它不歸我所有,而是歸網路伺服器使用者 (www) 所有。
我不能將 shell 用作 Web 伺服器使用者 (www) 或 root,但我使用了一個腳本(由 Web 伺服器使用者執行)將它所在的 modbits 目錄設置為 777,將文件本身設置為 666。
我無法重命名(或刪除此)文件。即使使用 inode 和 using
find
失敗:$ 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
的文件名,然後將其傳遞xargs
給rm
命令。
- 首先,我通過執行獲得了真實姓名
ls -lb
這將顯示目錄中文件的八進制名稱。在這種情況下,
\004
。 2. 然後,我跑了這樣的事情:echo "\004" | xargs rm
那是我的解決方法——也許你可以嘗試類似上面的方法,但是使用
Idezbox - коробка.jpeg
八進制的整個文件名()。