web-dev-qa-db-ja.com

ファイル名に認識されない文字(Linux)

LinuxMintでファイルにアクセスする際に問題が発生しました。その理由は明らかにファイル名の認識されない文字ですが、私が知っているテクニックのどれも私がそれの名前を変更するのを助けませんでした。

したがって、ここに詳細があります:ファイル名は次のようなものです:

êà_0_4àíòè_0_7-_0_7_0_8ó_0_1à333333.mp3

または、少なくともこれは私のファイルマネージャーとターミナルがそれを表示する方法です。

LinuxMintで使用しているプログラムでファイルを開くことができません。メディアプレーヤーなど...

ファイルマネージャを介して名前を変更したり、移動したり、コピーしたりすることはできません。これらの操作はすべて、次のようなエラーメッセージを生成します。

(名前の変更用):

Error renaming file: No such file or directory.

(コピー/移動用):

No such file or directory.

また、ワイルドカードを使用してターミナルから名前変更コマンドを試しました。コマンドはファイル名を正しく選択しますが、コピーできません。出力は次のとおりです。

cp *0_7-_* 1.mp3
cp: cannot open `êà_0_4àíòè_0_7-_0_7_0_8ó_0_1à333333.mp3' for reading: No such file or directory

Mvコマンドも使ってみましたが

mv *0_7-_* 1.mp3
mv: cannot move `êà_0_4àíòè_0_7-_0_7_0_8ó_0_1à333333.mp3' to `1.mp3': No such file or directory

Sudoの名前変更を実行しようとすると、次のようになります。

Unrecognized character \xC3; marked by <-- HERE after <-- HERE near column 1 at (eval 1) line 1.

ファイル自体は有効なMP3ファイルです。 XPのWindowsMediaPlayerで開くことができます。

問題は次のとおりです。私は大きな音楽ライブラリ(100Gb以上)を持っていて、名前に無効な文字が含まれている同様のファイルがほとんどありません。私はこれらのファイルを失いたくないので、将来そのような状況を処理する方法を理解したいと思います(Linuxでは、Windowsを実行するPCを所有していないため、できれば)。

どんな助けでもありがたいです

PDATE: terdonの要求に応じて、localeの出力は次のとおりです。

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

PDATE 2友達に確認したところXPマシン。以下の結果を確認できます。元のファイルはWindowsMedia Playerで再生できますが、再生できません。 Winampによる。ただし、ファイルマネージャを介してアクセスして名前を変更すると、両方のプレーヤーで再生されます。

したがって、これはis認識されない文字の問題であると結論付けます。私はまだLinuxでのソリューションに興味がありますが、

3
Art Gertner

4つのこと:

ソリューションの補足を試してください-他のすべてを移動してから、すべてを削除してください。

mkdir ../everything_else
mv problematic/folder/path/* everything_else
Sudo rm -rf problematic/folder/path

ファイルにACLがないことを確認し、問題の原因となっている可能性のあるものをすべて削除します:

$ /bin/ls -le problematic/folder/path
total 16
-rw-r--r--+ 1 whmcclos  staff  1918 Dec 18 09:00 README
0: user:_spotlight inherited allow read,execute,readattr,readextattr,readsecurity
$ chmod -a "..."

Perlスクリプトを試してOS/FSの名前付けの依存関係を滑らかにしますか?

たとえば、このコードフラグメントの行に沿った何か-ファイル名を匿名の$ _に保持します。

$ mkdir fred; cd fred; touch a b c d e f
$ cat > try.pl
#!/usr/bin/Perl
opendir(D,".") or die "cannot open .\n";
@files=readdir(D);
closedir(D);
foreach (@files) {
  next if /\.{1,2}/;                      # Skip directory entries
  print; print "? "; $r = <>; chop($r);   # Provide some level of control
  if($r eq "y" or $r eq "Y") {unlink;}    # Should report if cannot unlink unnamed file - tbd.
}
^D
$ /usr/bin/Perl try.pl
a? 
b? 
c? y
d? 
e? 
f? 
$ ls
a       b       d       e       f       try.pl

[作者の当初の意図を反映するように更新されました-獣を行儀の良いファイル(名前)にコピーしてください:]

Perlが不正なファイルを正常に動作するファイルにコピーできるかどうかを確認するには、以下のPerlスクリプトを使用します-まだ上記の行に沿って-Perlに「匿名で」ファイル名にアクセスさせます。

(また、ACLを実際にチェックする必要があります。ACLは、rootが通常rootとしてファイルにアクセスするのを防ぐことさえできます。

Perlスクリプトは次のとおりです。

$ cat try3.pl
#!/usr/bin/Perl
# A code fragment to ask to copy a displayed file to $TO; chg $TO on next line:
$TO="my_new_behaved_filename";       # This is the name that will be copied to
opendir(D,".") or die "cannot open .\n";
@files=readdir(D);
closedir(D);
foreach $f (@files) {
  next if $f =~ /\.{1,2}/;           # Skip directory entries, "." & ".."
  print "$f? "; $r = <>; chop($r);   # Provide some level of control; "y" or "Y"
  if($r eq "y" or $r eq "Y") {       #   to copy the displayed filename to $TO
    print "copying it to $TO...\n";
    # Now, see if we can copy the darn thing to $TO:
    open(FROM,$f) or die "sorry - couldn't open it...";
    open(TO,">$TO");
    while(read FROM, $buf, 16384) {
      print TO $buf;
    }
    close(TO);
    close(FROM);
  }
}

Try3.plが前述のPerlスクリプトであると仮定して、これをそのまま使用します。

$ ./try3.pl 
a? 
b? 
d? y
copying it to my_new_behaved_filename...
e? 
f? 

シンボリックリンクまたはハードリンクを介してファイルにアクセスし、どのマイレージが得られるかを確認してください。

Viのファイル名[タブ]展開を使用して、リンクするファイルをシェルに「識別」しようとします。

〜/ {。vim、.viminfo、.vimrc}を脇に移動して、ワイルドメニュー入力などを制限しました。あなたは同じことをしたいかもしれません。

ここで、偽のファイルを含むフォルダーで次のコマンドラインシーケンスを開始します。

$ vi

Viでは、この文字シーケンスを正確に入力します

!!ln -s [tab]

つまり、キーシーケンスは、感嘆符、感嘆符、el、en、空白、ダッシュ、es、空白、タブでした。 [tab]キーを押すとすぐに、現在の作業ディレクトリの最初のファイルがviのステータス行の空白文字(「s」に続く)の後に表示されます。 [tab]キーを何度も押して、偽のファイル名に切り替えます。偽のファイル名が表示されたら、スペースバーを押してスペースを追加し、新しいファイル/リンク名を入力します。

Viのステータス行の結果は次のようになります。

!!ln -s bogus_filename new_sym_link_name

リターンキーを押して、リンクコマンド(viから生成され、viの空のバッファー内の現在のヌル行を置き換えます。ここでは気にしません。タブ拡張を使用してシェルコマンドを実行する副作用が必要です)を確認します。リンクnew_sym_link_nameを作成します。

:q![return]を指定してviを終了し、シンボリックリンクを介してファイルにアクセスできるかどうかを確認します。

(上記のlnコマンドで-sを省略して、ハードリンクを試すこともできます。

Windowsでファイル名を変更できることに気付いたので、どういうわけか、キャリッジリターンの改行シーケンスがファイル名に組み込まれ、さまざまなアプローチが混乱していると思います。

2
Billy McCloskey

ls -liを使用して、問題のファイルのiノード番号を取得します。 iノード番号(最初のフィールド)をメモします。例として123456を使用します。

次に、findを使用してファイルを削除します。

find -inum 123456 -exec rm {} \;

または名前を変更するには:

find -inum 123456 -exec mv {} some_better_filename \;
1
user285227