刪除檔案名稱包含不允許字元的文件

刪除檔案名稱包含不允許字元的文件

/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\;\?\>

將來,當你有非常奇怪的檔案名稱時,嘗試使用 shell全域機制,例如:

ls .*php*

應該是個好的開始。如果您有許多文件名稱相似的文件,則只需使用任何唯一的常規子字串

ls .*php*cmd*echo*m3rg3*

最後,Tab如果您使用的 shell 具有完成機制,則可以點擊完成檔案名稱。

答案3

rmglob patterns是個聰明的野獸,你可以在論證中 使用

對於您的情況,簡單rm .\<*就足夠了

rm*使用with時要小心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...

相關內容