Eliminar todos menos 1 archivo y 1 directorio en Linux

Eliminar todos menos 1 archivo y 1 directorio en Linux

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, co 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: findcambia su comportamiento cuando -deletese especifica ( findadvierte sobre esto y no continúa cuando -prunese especifica). Sin embargo , siempre puedes canalizar la salida a xargsy rmo 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 findanuncios 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 {
}
}

información relacionada