奇妙な文字でファイル名を変更する方法

奇妙な文字でファイル名を変更する方法

ギリシャ語またはキリル文字を含むファイルがあります。

それは私のものではなく、Webサーバーユーザー(www)のものです。

シェルをWebサーバーユーザー(www)やrootとして使用することはできませんでしたが、(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文字()の8進数コードです\004。そこでどのように作られたのかは全く分かりません。ただし、削除するときに実行する作業は、echoそのファイル名をコマンドに渡すことです。xargsrm

  1. まず、私は得た。本物実行して名前を付ける

    ls -lb
    

    これにより、ディレクトリ内のファイルの8進数の名前が表示されます。この場合は\004

  2. その後、次のように実行しました。

    echo "\004" | xargs rm 
    

Idezbox - коробка.jpeg私の回避策は次のとおりです。上記の方法を試すことができますが、完全なファイル名を8進数()として使用することをお勧めします。

答え3

あなたの質問は、問題ファイルがNFSマウントファイルシステムにあり、RHELクライアントが実行する操作がファイルに正常に到達できないことを示しています。これは、問題がクライアントとNFSサーバー間のインターフェースに関連していることを示しています。ファイルを操作するには、サーバーに直接ログインする必要があるか、少なくとも他のオペレーティングシステムを実行しているワークステーションからファイルにアクセスする必要があります。

答え4

@pacoseventeenの答えは基本的に正しいです。中かっこを二重引用符で囲む必要があると思います。私は一括名前変更のために名前変更を使用しません。

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

ls -Q「\033\033」と識別されたファイルに使用しました。

関連情報