2016年5月10日火曜日

NTFS上のファイル名の不具合を修正する。ubuntuからWindowsのファイルを治す。

仮称「NTFS+Win32だめ文字、パターン」

ファイルシステムとしてのNTFSではOKだが、OSとしてのWindowsでは許容されずファイル名に使うとややこしくなる(消せない、見えないなど)文字、仮称「NTFS+Win32だめ文字、パターン」というのがあります。ディレクトリについても同じです。

  • 末尾がスペースで終わるファイル名。 "大阪Lover " 
  • 末尾がコロンで終わるファイル名。"大阪Lover."

当方の癖や意図で、作るパターンはこの2つ。後者はWindowsしか使ったことがない人には理解できないかもしれません。それはそれで幸せ。このふたつを代表例に対応を例示してみます。

以下、renamej というのは、自分がパッチをあてたものなので、標準ubuntuではrenameです。

新規にターミナル(端末)を開きます。ubuntu系は以下を同時押し。CTRL+ALT+T

findを使って一括処理するのが楽なので、find前提です。たった一つなら、ubuntuのファイルマネージャー(Windows用語、エクスプローラ)で、リネームすれば良いのです。

末尾空白

末尾がスペースで終わるファイルを列記する。ディレクトリ限定
find . -type d -name '*? ' -execdir echo \"{}\" \;
#
その余分なスペースを除去する。リネームする。

(リネームの変化を確認) -n
find . -type d -name '*? ' -execdir renamej -n 's|\s$||' {} \;
(リネームを実行) -v
find . -type d -name '*? ' -execdir renamej -v 's|\s$||' {} \;
#こっちが賢いかも。
find . -type d -name '*? ' -execdir renamej -v 's|(.*?)\s$|$1|' {} \;

末尾ドット

末尾がドットで終わるファイル名を列記する。(MS-DOS制限が伝統のWindows)
find . -type f -name '*?.' 
#
末尾ドットのみまとめて削除(つまりリネームする)
find . -type f -name '*?.' -execdir renamej -v 's|(.*?)\.$|$1|' {} \;

#
末尾ドットのみまとめて削除(リネームする)ドット連続も一度にリネームする。
find . -type f -name '*?.' -execdir renamej -v 's|(.*?)\.*?$|$1|' {} \;


自分の場合は正規表現的にもこれくらいで対応できます。Bash on Windows で実行できるかもしれませんが試していません。Windowsを起動することがあればやってみよう。

完全な隠しディレクトリを作る裏技(単なる応用)


別の視点で考えます。積極的に考えると、末尾空白、末尾ドットなどを活用するとファイルが隠せます(エクスプローラーでは開けないよー、消せないよーなどの特性を活用するわけです)。先頭ドットなども組み合わせて、いろいろ頑張ってください。何のこっちゃ。初心者には理解できないからいいのですね。この節はWindows視点で書かれています。

根こそぎ、変換はしないほうがいい「:」

「:」に関しては、根こそぎはやめたほうがいいです。一般ユーザーには使わせませんが、WindowsOSは「:」の入ったシステムファイルを作ります。根こそぎやって、少し泣いた。笑) 慎重に条件指定してください。

メモ
\ < > : " / \ | ? *

AUX、CLOCK$
COM1 ~ COM9、CON、CONFIG$
LPT1 ~ LPT9、NUL、PRN

おまけ、fuseNTFSでクラッシュが置きた場合などに残るドットファイルを削除する。ubuntuなら /media/ 配下に通常できます。デフォルトでそこにマウントされるので。以下例示。

cd /media
find . -name '.fuse*'  で探す。

削除したい場合

find . -name '.fuse*' -delete 探したリスト通りでよければ問答無用で削除する。