我有带有希腊或西里尔字符的文件。
它不属于我,而是属于网络服务器用户(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
其文件名传递给命令。xargs
rm
首先,我得到了真实的通过运行命名
ls -lb
这将显示目录中文件的八进制名称。在这种情况下,
\004
。然后,我跑了这样的事情:
echo "\004" | xargs rm
Idezbox - коробка.jpeg
这是我的解决方法 - 也许您可以尝试类似上面的方法,但使用八进制的 整个文件名 ( )。
答案3
您的问题表明此问题文件位于 NFS 安装的文件系统上,并且您从 RHEL 客户端执行的任何操作都无法成功触及该文件。这表明问题与客户端和 NFS 服务器之间的接口有关。可能需要直接登录服务器来操作该文件,或者至少从运行不同操作系统的工作站访问该文件。
答案4
@pacoseventeen 的答案基本上是正确的,我认为你只需要用双引号将大括号括起来。我不会使用重命名,因为那是用于批量重命名。
find . -inum INODE -exec mv "{}" NEW_NAME \;
我刚刚在名为 ?? 的文件上使用了它标识ls -Q
为“\033\033”。