Quiero eliminar todos menos 1 archivo y 1 directorio del directorio en el que me encuentro actualmente. ¿Cómo hago para hacerlo?
Tengo un directorio que tiene tres directorios a, b, cy tres archivos 1.php, 2.php, 3.php. Quiero eliminar los directorios a y b, así como los archivos 1.php y 2.php únicamente. Estoy buscando una solución para hacer esto de una manera más fácil. Estoy buscando una solución que pueda usarse a mayor escala con más carpetas y archivos.
Respuesta1
find directory -not \( -name temp -o -name 3.php -o -name c -prune \) -delete
Un caso de prueba rápido demostró que funcionó al menos en este caso exacto. Si hay subdirectorios llamados, por ejemplo, c
o algo así, creo que también podrías excluirlos. Es fácil hacer que funcione en casos generales, pero definir un comando de búsqueda en general requiere algunas pruebas.
Pruebe sin la declaración "-delete" para ver con qué archivos coincide.
PRESSTOP: find
cambia su comportamiento cuando -delete
se especifica ( find
advierte sobre esto y no continúa cuando -prune
se especifica). Sin embargo , siempre puedes canalizar la salida a xargs
y rm
o escribir -execdir rm {} \;
en lugar de -delete
.
Ejemplos:
find directory -not \( -name directory -o -name 3.php -o -name c -prune \) -execdir rm -r {} \;
find directory -not \( -name directory -o -name 3.php -o -name c -prune \) -print0 | xargs -0 rm -r
Siempre es un asunto complicado y, cuando el objetivo es eliminar archivos, hay que realizar casos de prueba exhaustivos. Tengo bastantes find
anuncios similares ejecutándose todas las noches y no puedo decir que no estuviera nervioso por liberarlos :-)
Respuesta2
Mi instinto es este: si solo tiene un archivo para guardar y un directorio, cópielos en un lugar seguro y luego elimine el resto.
cp /dir/file.txt /safe/dir/
cp -R /dir/to/save /safe/dir/
rm -rf /dir/
Respuesta3
Pruebe el siguiente script en pseudoperl:
#request the file you don't want to delete and store the name in a scalar variable.
opendir(DIRHANDLE, ".") || die "Could not open Directory handle.";
@list = readdir(DIRHANDLE);
foreach $name (@list) {
if($name != $your_input_variable) {
unlink($name);} else {
}
}