Eliminar archivo con nombre de archivo que contiene caracteres no permitidos

Eliminar archivo con nombre de archivo que contiene caracteres no permitidos

En /tmpel directorio tengo un archivo con este nombre de archivo:

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

No puedo eliminar este archivo por medios normales y he intentado citar este nombre de archivo sin resultados.

¿Qué debo probar a continuación?

Respuesta1

Úselo ls -lipara ver el inodo y retire el inodo confind

[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

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

Respuesta2

Prueba esto:

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

Y en el futuro, cuando tenga un nombre de archivo realmente extraño, intente utilizar el shell.globomecanismo, por ejemplo:

ls .*php*

debería ser un buen comienzo. Si tiene muchos archivos con nombres similares, simplemente use cualquier subcadena regular única

ls .*php*cmd*echo*m3rg3*

Y al final puede presionar Tabpara completar el nombre del archivo si el shell que está utilizando tiene un mecanismo de finalización.

Respuesta3

rmes una bestia inteligente, puedes usarla glob patternsen el argumento

Para tu caso un simple rm .\<*es suficiente

*tenga cuidado al utilizar rmwith glob patternsya que eliminará varios archivos que coincidan con el patrón

Respuesta4

findGNU o no GNU

Con la versión GNU de findpuedes escribir directamente, sin buscar su inodo,

find . -name '.<*' -delete

Por supuesto, siempre se sugiere probar antes sin la -deleteopción y verificar el nombre de los archivos que vas a eliminar.

Con una versión que no sea GNU también se podría hacer directamente find . -name '.<*' -exec rm -i {} \;y funciona también con la versión GNU, sólo que unas 3 veces más lento [1] luego con -delete.
Cuando no haya demasiados archivos, también podrás usarlos find . -name '.<*' -exec rm -i {} +, nuevamente más rápido.

perl

Asumiendo .<*como clave que selecciona todos y solo los archivos que desea eliminar (no sin algunosgimnasiaen la cuerda)

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

Para eliminar todos los archivos ocultos del directorio es suficienteperl -e 'for(<'.*'>){((stat)[9]<(unlink))}'

Es más rápido con muchos archivos. Compruebe la expresión porque normalmente no trabajo con Perl.

Solución alterna

En general, puede intentar mover todos los demás archivos en otro directorio y eliminar el directorio original.

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

Inconvenientes si algún archivo está en uso... pero hay casos en los que también puedes usarlo.

Ps> no olvides rsynchacer /dev/nullcon la -deleteopción...

información relacionada