web-dev-qa-db-ja.com

「?」で始まるように見える名前のファイルを削除しますコマンドラインで

私はDebian安定版のCinnamon DEで実行しています。コマンドラインで削除したいファイルがいくつかあります(今のところ、Nemoでこれらのファイルを削除しています)。

たとえば、これらの.txtファイルは「?」で始まりますシェルとネモではこれ「?」キャリッジリターンに置き換えられます。

$@debian: ls
ssolveIncpUL46pK  ?ssolveIncpUL46pK.txt

nemo

私は試した:

 rm ?ss*
 rm \?ss*
 rm \ ss*
7
Smilia

文字は疑問符ではありません。 lsユーティリティは、印刷できない文字を?に置き換えます。さらに、印刷不可能な文字が実際にファイル名のfirst文字であるかどうか、またはその前に1つまたは複数のスペースがあるかどうかも不明です。

これらのファイルを両方とも削除したい場合は、「不良部分」を*と照合し、残りの可視ファイル名をより詳しく指定します。

rm -i ./*ssolve*

これにより、最初に指定されたパターンがそれに一致するすべてのファイル名に展開され、次にrmがそれらを削除します。上記の短いパターンに一致するファイルを削除したくないファイルがある場合は、より具体的にファイル名の長い部分を指定します。と

rm -i ./*ssolveIncpUL46pK*

これは、削除するファイルと同じディレクトリにいることを前提としています。

rm-iオプションは、実際に何かを削除する前に確認を求めます。

17
Kusalananda

これらの種類のファイルを削除する適切な方法は、ファイルのinode値を使用することです。

次のコマンドを使用してinode値を取得します

 ls -li 

 12582925 -rw-r--r--  1 root root   646 May 23 02:19 ?ssolveIncpUL46pK.txt

ロングリストの結果の最初のフィールドはiノード値です。

次に、findコマンドを使用して、ファイルw.r.t inodeを削除します。

find . -inum 12582925 -exec rm -i {} \;
27
msp9011

*を使用してファイルを削除することはお勧めしません。それはあなたが好きな以上に一致する可能性があります。

Debianであるため、ls(GNUから)コマンドはファイルの値を引用符付きの形式で出力できます[1]

$ ls -Q
"\nssolve"  "\n\nssolve"  "y"  "z"

あるいは、引用符で囲まれた名前とiノードを含むファイルを一覧表示します。

$ ls -iQ
26738692 "\nssolve"  26738737 "\n\nssolve"  26738785 "y"  26738786 "z" 

次に、inode番号を指定してrmを使用し、正しいファイルのみが削除されるようにします。

$ find . -xdev -inum 26738737 -exec rm -i {} \;

Findの呼び出しは、同じiノード番号を持つ他のファイルシステム上のファイルと一致しないように、1つのファイルシステム(-xdev)に制限されています。また、rm-i(インタラクティブ)オプションを指定して呼び出されているため、コマンドラインで各ファイルを消去するかどうかを尋ねられます。


[1] これは、キリル文字а($ '\ U430')やラテン語a($ '\ U61')のように、見た目は混乱するがまったく同じように見える文字の問題を解決しないことに注意してください。ない。ファイル名が使用しているバイトを見やすくするために、16進ビューアを使用する必要があります。

$ touch а a é $'e\U301' $'\U301'e
$ ls
a  ́e  é  é  а              # what you "see" here depends on your system.

$ printf '<%s>' * | od -An -c
   <   a   >   < 314 201   e   >   <   e 314 201   >   < 303 251
   >   < 320 260   >
12
Isaac