如何重命名带有奇怪字符的文件

如何重命名带有奇怪字符的文件

我有带有希腊或西里尔字符的文件。

它不属于我,而是属于网络服务器用户(www)。

我无法以 Web 服务器用户 (www) 或 root 身份使用 shell,但我使用了一个脚本(由 Web 服务器用户执行)将其所在的 modbits 目录设置为 777,并将文件本身设置为 666。

我无法重命名(或删除此)文件。即使使用 inode 并使用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月2日编辑:

结果发现问题与 NFS 有关。由于该文件是直接在 NFS 安装的卷上创建的(我从另一台计算机访问该卷),所以没有任何效果。以 root 身份直接登录服务器允许系统管理员(我只是这个特定系统上的用户,无法执行此操作)删除文件(使用某种标准方法来转义希腊字符)。感谢G-曼让我走上正轨(在评论中)。如果G-曼仍然存在并将他的评论转化为答案,我会接受它。

答案1

我知道这已经很旧了,但是如果您想重命名带有奇怪字符的文件,您可以使用:

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

所以在这种情况下你可以使用:

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

答案2

不考虑NFS问题的一部分,几天前我在尝试删除一个没有名称/空白名称的文件时遇到了类似的问题。嗯,实际上,它不是空白的 - 它的名称是字符end of transmission( ) 的八进制代码\004。它是如何在那里创建的,不知道。但是,我删除它时所做的是将echo其文件名传递给命令。xargsrm

  1. 首先,我得到了真实的通过运行命名

    ls -lb
    

    这将显示目录中文件的八进制名称。在这种情况下,\004

  2. 然后,我跑了这样的事情:

    echo "\004" | xargs rm 
    

Idezbox - коробка.jpeg这是我的解决方法 - 也许您可以尝试类似上面的方法,但使用八进制的 整个文件名 ( )。

答案3

您的问题表明此问题文件位于 NFS 安装的文件系统上,并且您从 RHEL 客户端执行的任何操作都无法成功触及该文件。这表明问题与客户端和 NFS 服务器之间的接口有关。可能需要直接登录服务器来操作该文件,或者至少从运行不同操作系统的工作站访问该文件。

答案4

@pacoseventeen 的答案基本上是正确的,我认为你只需要用双引号将大括号括起来。我不会使用重命名,因为那是用于批量重命名。

find . -inum INODE -exec mv "{}" NEW_NAME \;

我刚刚在名为 ?? 的文件​​上使用了它标识ls -Q为“\033\033”。

相关内容