この見えないファイルをどのように削除できますか?

この見えないファイルをどのように削除できますか?

背景

というフォルダがあります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プロパティ
  • statakorgそしてすべてに対して同じ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 -iinode番号を取得して削除するために使用されます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
% 

おすすめ記事