背景
というフォルダがありますakorg✽
。このUnicode文字は、ソフトウェアが私のファイルパスのテキストエンコーディングについて間違った仮定をしたときに面倒なことになるので、名前からそれらを削除したいと思います。
質問
これは簡単だと思うかもしれません:
$ mv akorg✽ akorg
mv: cannot move ‘akorg✽’ to a subdirectory of itself, ‘akorg/akorg✽’
しかし、これは奇妙です。名前付きフォルダがakorg
既に存在すると思います。私は一つもないと確信しています。
$ ls -la
total 699K
drwxr-xr-x 15 ak ak 15 Jun 12 17:34 .
drwxr-xr-x 57 ak ak 4.0K Jun 12 17:35 ..
drwxr-xr-x 11 ak ak 21 Jun 12 16:58 akorg✽
drwxr-xr-x 2 ak ak 2 May 28 20:47 Desktop
...
ところでstat
またこういう言葉があります。
$ stat akorg
File: ‘akorg’
Size: 21 Blocks: 33 IO Block: 1536 directory
Device: 15h/21d Inode: 292128 Links: 11
...
明らかに見えないフォルダがあるようです。とにかく削除します。
$ rmdir akorg
rmdir: failed to remove ‘akorg’: No such file or directory
それでは。一体これは何ですか?
私が今まで知っていること
- 使っています安定したリリース~のLinuxのZFS。これはzpoolステータスとzfsプロパティ。
stat
akorg
そしてすべてに対して同じinodeを返しますakorg✽
。このインデックスノードで検索すると、次の値のみが返されますakorg✽
。$ find . -maxdepth 1 -inum 292128 ./akorg✽
「見えない」フォルダでは機能しない追加の操作:
$ rm akorg rm: cannot remove ‘akorg’: Is a directory $ unlink akorg unlink: cannot unlink ‘akorg’: Is a directory $ mv akorg akorg_temp mv: cannot move ‘akorg’ to ‘akorg_temp’: No such file or directory
- Bash 4.2.45とzsh 5.0.0で同じ結果が得られました。どちらの場合も、タブの完成
ak
のみが返されますakorg✽/
。 - これストレス最初の名前を変更しようとすると、名前を正しく入力したことが確認され、名前が既存のフォルダによってブロックされました
akorg
。 より明示的な名前変更の試みへの応答は複雑で恐ろしいものでした。
$ mv --verbose --no-target-directory --no-clobber akorg✽ akorg removed ‘akorg✽’
なぜ削除したと主張するのか
akorg✽
、なぜ試すのか理解できません。幸い、実際には何も消えていないことがわかりls
ましstat akorg akorg✽
た。これはストレス。akorg✽
奇妙なエンコーディングを排除するために、今は中間名を指定しました。$ mv --verbose --no-target-directory --no-clobber akorg✽ bananas ‘akorg✽’ -> ‘bananas’
予想通り、
$ ls -la total 715K drwxr-xr-x 16 ak ak 16 Jun 13 15:11 . drwxr-xr-x 57 ak ak 4.0K Jun 13 14:03 .. drwxr-xr-x 11 ak ak 21 Jun 12 16:58 bananas drwxr-xr-x 2 ak ak 2 May 28 20:47 Desktop ...
ただし、「invisible」フォルダはまだ存在します。
$ stat bananas akorg File: ‘bananas’ Size: 21 Blocks: 33 IO Block: 1536 directory Device: 15h/21d Inode: 292128 Links: 11 ... File: ‘akorg’ Size: 21 Blocks: 33 IO Block: 1536 directory Device: 15h/21d Inode: 292128 Links: 11 ...
mv
その名前を使用しようとすると、まだ奇妙に動作しますakorg
。$ mv --verbose --no-target-directory --no-clobber bananas akorg removed ‘bananas’
ベストアンサー1
zshを使用している場合は、タブ補完またはシェルワイルドカードを使用することをお勧めします(削除する前に常にecho / lsを使用)。それでも問題が解決しない場合は、次のようないくつかのオプションがあります。
Hex Dumpでファイル名を確認して$'...'
入力するために使用します。
% touch akorg✽
% ls | grep akorg | hexdump -C
00000000 61 6b 6f 72 67 e2 9c bd 0a |akorg....|
00000009
% ls $'akorg\xe2\x9c\xbd'
akorg✽
% rm $'akorg\xe2\x9c\xbd'
% ls
%
上記の最後の文字は0a
入力の末尾にある改行文字なので、名前に表示したくありません。
ls -i
inode番号を取得して削除するために使用されますfind
。
% touch akorg✽
% ls -i
6128574 akorg✽
% find . -inum 6128574
akorg✽
% find . -inum 6128574 -delete
% ls
%
名前で行くこともできますfind
(どちらか先に印刷してください!)。
エスケープされた名前を取得してls -b
入力します$'...'
(印刷されていない文字に対しては機能しますが、Unicode文字には影響しないようです。他の人が参照する目的でのみ使用します)。
% ls
foo?bar
% ls -b
foo\rbar
% rm foo$'\r'bar
% ls
%