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

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

/tmpディレクトリには、次のファイル名を持つファイルがあります。

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

一般的な方法では、このファイルを削除できず、このファイル名を参照しようとしましたが、結果はありません。

次は何を試すべきですか?

答え1

ls -liインデックスノードを表示し、次を使用してインデックスノードを削除するために使用します。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

rmglob patternsあなたが議論に使用できる賢い獣です。

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

rmglob patterns*withを使用すると、パターンに一致する複数のファイルが削除されますのでご注意ください。

答え4

findGNUまたは非GNU

GNUバージョンでは、findinodeを探さなくても直接書くことができます。

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

関連情報