印刷されない文字を含むファイルを削除する[重複]

印刷されない文字を含むファイルを削除する[重複]

誤って生成されたため、非常に誤った名前のファイルが見つかりました。出力ls -lq

ls -lq
total 2
-rw-r--r--. 1 mbyx7ag2 zk01 0 May  1  2014 ???E@X?p@8?@

私はこれを殺そうと何度も試してみましたが、今まで役に立ちませんでした。lsファイルを表示して使用できるにもかかわらず、ファイルが存在しないためエラーが発生するたびにstat:

stat ^A?E\@X?p\@8^H\@ 
  File: `\001\360\265E@X\342p@8\b@'
  Size: 0           Blocks: 3          IO Block: 32768  regular empty file
Device: 1ah/26d Inode: 5239755888  Links: 1
Access: (0644/-rw-r--r--)  Uid: (231058/mbyx7ag2)   Gid: (10027/    zk01)
Access: 2014-05-01 15:47:28.638919596 +0100
Modify: 2014-05-01 15:47:28.638919596 +0100
Change: 2014-05-01 15:47:28.638919596 +0100

興味深いことに、そこにあるstatコマンドはタブの完成の結果であり、他の場所で使用されている名前とはまったく異なります。

私は次の質問のアイデアを試しました。

名前のないファイルを削除する方法

印刷できない文字のみを含むファイルを見つける方法はありますか?

私もこの2つの方法を試しました。ファイル名から印刷されない文字を削除する - Arctic Regional Supercomputing Center(「印刷されない文字の削除」の下)。

心配的には、inodeを使用するいわゆる「完璧な」技術は次のとおりです。

ls -i
5239755888 ???E@X?p@8?@
find . -inum 5239755888 -delete
find: cannot delete `./\001\360\265E@X\342p@8\b@': No such file or directory

動作しません。

このファイルを削除するために使用できる他の方法を知っている人はいますか?

答え1

印刷した統計が正しいファイル名のようです(ディレクトリに保存されています)。

  File: `\001\360\265E@X\342p@8\b@'

以下を使用して名前(バイト単位)を再構成できます。

$ printf '%b' '\001\360\265E@X\342p@8\b@' | od -An -tx1
soh   p   5   E   @   X   b   p   @   8  bs   @
 01  f0  b5  45  40  58  e2  70  40  38  08  40

ご覧のとおり、文字列は制御文字(soh)または16進数0x01(8進数\ 001)で始まります。これは悪い結果(ファイルを消去するのが難しい)と良い結果(同じ名前のファイルがディレクトリに存在する可能性が低い)の両方を引き起こします。

(安全のため)すべての(その他)ファイルをディレクトリから移動した後。

rmを入力してからファイルの最初の文字(soh)を入力し、アスタリスク()を入力してファイルを削除してみることができます*(実行したものと同様)erase a*。タイピングのコツ0x01は と を同時に入力し Ctrl vと を入力することCtrlですA(交代不要)。^Aカーソル位置に表示する必要があります。次にアスタリスクを入力します*。コンソールに次の行が表示されます。

rm ^A*

次にEnterを押すとファイルが消えます。

それでもうまくいかないと(何度か試して)、常に核兵器ソリューションがあります。他のすべてのファイルを移動して削除し、親ディレクトリに変更したら、次の操作を行います。

rm -rf ./CorrectDirectory        ### Be careful this will erase ANYthing.

ディレクトリ全体(ファイルを含む)が消えます。

答え2

名前の実際の文字を知っているので、次の説明に従ってファイル名の正しいエスケープシーケンスを作成するだけです。http://tldp.org/LDP/abs/html/escapingsection.html

  1. 作る

    $ echo test > $'\001\360\265E@X\342p@8\b@'
    $ stat $'\001\360\265E@X\342p@8\b@'
      Fichier : ''$'\001\360\265''E@X'$'\342''p@8'$'\b''@'
       Taille : 5           Blocs : 8          Blocs d'E/S : 4096       fichier
    Périphérique : 10302h/66306d    Inœud : 6948089     Liens : 1
    Accès : (0640/-rw-r-----)  UID : ( 1001/username)   GID : (                                 1003/jrousseau)
    Accès : 2018-06-20 11:40:44.333208199 +0200
    Modif. : 2018-06-20 11:40:47.589113454 +0200
    Changt : 2018-06-20 11:40:47.589113454 +0200
      Créé : -
    
  2. 削除

    $ rm -i $'\001\360\265E@X\342p@8\b@'
    rm : supprimer fichier ''$'\001\360\265''E@X'$'\342''p@8'$'\b''@' ? y
    $
    

答え3

簡単な方法はmc

あなたの場合はstatファイルを見ることができますが、rm見ることはできません。これはとても奇妙です。これは実際にはファイルシステムに問題がある可能性があります。 (努力していますfsck。)

straceさらなるデバッグのために、あるコマンドはファイルを見ることができ、他のコマンドは見ることができない理由を調べることができます。

別のアイデアは、rm -rディレクトリ全体を削除することです。 (おそらく、内部の重要なファイルをすべてバックアップした後です。)

答え4

  • ディレクトリ内のすべてのファイルを一覧表示し、名前をfile_listに保存します。
  • 削除するファイルを除くすべてのファイルを削除するには、file_listを編集します。

for f in \`cat file_list\` 
do
   /bin/rm  -i  $f   # option i to be extra safe 
done 

関連情報