許可されていない文字を含むファイル名のファイルを削除する

許可されていない文字を含むファイル名のファイルを削除する

dirに/tmp次のファイル名のファイルがあります:

.<?php passthru($_GET['cmd']);echo 'm3rg3';?>

通常の方法ではこのファイルを削除できず、このファイル名を引用符で囲んで試してみましたが、結果は得られませんでした。

次は何を試してみるべきでしょうか?

答え1

ls -liinodeを確認するには、inodeを削除します。find

[root@server tmp]# ls -li .\<*
16163346 -rw-r--r-- 1 root root 0 Jun 23 12:02 .<?php  passthru($_GET[cmd]);echo 
[root@server tmp]# find . -inum 16163346 -exec rm -i {} \;
rm: remove regular empty file `./.<?php passthru($_GET[cmd]);echo'? y

参照:http://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

答え2

これを試して:

rm -iv -- .\<\?php\ passthru\(\$_GET\[cmd\]\)\;echo\ m3rg3\;\?\>

そして将来、本当に奇妙なファイル名を持つ場合は、シェルを利用してみてくださいグロブメカニズム、例:

ls .*php*

良いスタートになるはずです。似たようなファイル名のファイルがたくさんある場合は、一意の正規の部分文字列を使用してください。

ls .*php*cmd*echo*m3rg3*

最後に、Tab使用しているシェルに補完メカニズムがある場合は、 を押してファイル名を補完することができます。

答え3

rm賢い獣なので、glob patterns議論に 使うことができます

あなたの場合は単純なものrm .\<*で十分です

*パターンに一致する複数のファイルを削除するので、rmwithを使用する場合は注意してください。glob patterns

答え4

findGNUかGNUでないか

GNU版ではfind、inodeを探すことなく直接書き込むことができます。

find . -name '.<*' -delete

もちろん、事前に-deleteオプションなしで試して、削除するファイルの名前を確認することを常にお勧めします。

非GNUバージョンでも直接実行でき、find . -name '.<*' -exec rm -i {} \;GNUバージョンでも動作しますが、約3倍遅くなります[1]の次に を使用します-delete
ファイルがあまり多くない場合は も使用できますがfind . -name '.<*' -exec rm -i {} +、これも高速です。

perl

.<*削除したいファイルだけを選択するキーとして(一部を除いて) ジム弦に

perl -e 'for(<'.'\<'*'>){((stat)[9]<(unlink))}'

ディレクトリの隠しファイルをすべて削除するには、perl -e 'for(<'.*'>){((stat)[9]<(unlink))}'

ファイルが多いほど速くなります。私は通常 perl を使用していないので、式を確認してください。

回避策

一般的には、他のすべてのファイルを別のディレクトリに移動し、元のディレクトリを削除してみることができます。

mv /tmp /tmp2; mkdir tmp; mv /tmp2/* /tmp; rm tmp2

一部のファイルが使用中の場合は欠点がありますが、使用できる場合もあります。

Ps>オプションをrsync忘れないでください.../dev/null-delete

関連情報