最初の特殊文字(♫など)を含むファイル名の処理

最初の特殊文字(♫など)を含むファイル名の処理

最近、ファイル名が「♫」文字で始まるファイルが見つかりました。このファイルをコピーしてに入力ffmpegし、端末でさまざまな方法で参照したいと思います。私は通常奇妙なファイル名をオートコンプリートしますが、最初の文字でさえ入力できないので失敗します。

コピー - 貼り付け操作を実行するためにマウスに切り替えたくありません。可能なシナリオについて多くのコードを覚えたくありません。私の一時的な解決策は、に切り替えて問題の文字を貼りvim付けて!lsコピーし、終了して端末に貼り付けることでした。これはうまくいきますが、とても怖いです。

この状況を処理するより簡単な方法はありますか?

メモ:状況が変わると魚の皮を使っています。

答え1

ファイル名の最初の文字が印刷可能であるが英数字またはスペースではない場合は、[[:punct:]]glob演算子を使用できます。

$ ls *.txt
f1.txt  f2.txt  ♫abc.txt
$ ls [[:punct:]]*.txt
♫abc.txt

答え2

お気に入りの最も簡単なアプローチは、ls [^a-zA-Z0-9]*それが私にとって効果的であるということです。しかし、terdonの答えは、extglobシェルオプションやシェルに依存しないアプローチにも注意を引くためのより良い仕事をします。

答え3

lsには、印刷できない文字を処理するためのいくつかのスイッチ(たとえば、--quote-name、--escape、--literal)がありますが、この場合、文字は「印刷可能」ですが「入力可能」ではないようです。 (少なくとも私のキーボードでは!)、したがって、これらのスイッチのどれも役に立たないようです。

したがって、名前に文字を含むファイルを削除する一般的な「無差別代入」方法では、次のことができます。

$ /bin/ls -1A|cat -n  # list all files (except . and ..), 1 per line, add line numbers
     1  ♫
     2  f1.txt
     3  f2.txt

問題のあるファイルを含む行を見つけます。おそらく最初の行である可能性が高いですが、5番目の行であるとしましょう。 5行目を印刷して16進数でエンコードします。

$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a                                      ....

0a(改行)文字を無視してエスケープ文字列を設定し、echoの-eオプションを使用してエスケープを変換します。

$ echo -e '\xe2\x99\xab'

これで、次のようにコピー/移動/削除できます。

$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’

または、シェルスクリプトの使用に限定されない場合は、Pythonで次のように実行できます。

$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')

このアプローチを使用すると、多くのファイルを処理でき、正しいファイルを選択し、ファイルを壊さずに名前を変更するなどのロジックを作成するだけです。

for f in os.listdir('.'):
  if not f.isalnum():
    newname = generate_newname(f)
    if not os.path.exists(newname):
      shutil.copy(f, newname)
    else:
      print newname, 'already exists!'

答え4

シンボリックリンクの名前変更

特殊文字(ファイル名の最初の文字または別の場所)を含むファイル名を処理する1つの方法は次のとおりです。もっと簡単な名前に変更してください。

必要な場合でもお使いいただけます元のファイル名を保持:ファイル名のコピーを名前変更します。
ファイルをコピーまたは作成することで実行できます。シンボリックリンクまたはハードリンクファイルに保存して名前を変更します。コピーの代わりにシンボリックリンクを作成するには、cpオプション-s(ハードリンクの場合)を使用します。-l

「デトックス」を使って名前を浄化する

きれいなファイル名に名前を変更するにはdetoxファイル名を整理するために定義されたさまざまな規則に従ってファイル名を変更するために使用できます。detoxrc文書。デフォルトでは、UTF8文字はオプションで削除され、次に-s utf_8-only置き換えられます_

$ touch '♫ 漢字カ' ♫foo
$ ls -1
♫foo
♫ 漢字カ
$ detox -s utf_8-only * 
$ ls -1                
_ ___
_foo


シンボリックリンクの「デトックス」

上記のシンボリックリンク処理と組み合わせる:

$ mkdir orig
$ cd orig 
$ touch '♫ 漢字カ' ♫foo
$ cd ..
$ mkdir clean
$ cd clean 
$ cp -s ../orig/* .
$ ll               
lrwxrwxrwx 1 14 Oct  8 05:52 ♫foo -> ../orig/♫foo
lrwxrwxrwx 1 21 Oct  8 05:52 ♫\ 漢字カ -> ../orig/♫\ 漢字カ
$ ls -1
♫foo
♫ 漢字カ
$ detox --special -s utf_8-only *
$ ll                                
lrwxrwxrwx 1 21 Oct  8 05:52 _\ ___ -> ../orig/♫\ 漢字カ
lrwxrwxrwx 1 14 Oct  8 05:52 _foo -> ../orig/♫foo

関連情報