6 votos

Accidentalmente los archivos copiados al directorio equivocado

Años atrás, he copiado todos los archivos de /usr/local/bin a /bin.

Ahora mi /bin directorio está lleno de archivos innecesarios. ¿Cómo puedo quitar el uso de la find comando sin tener que instalar los paquetes de terceros?

Nota:las Respuestas relacionadas con paquetes de terceros pueden ser útiles a otros que tienen la misma pregunta.

8voto

WinEunuuchs2Unix Puntos 1032

La pieza juntos soluciones disponibles en el Intercambio de la Pila.

Si usted hace suficiente investigación que usted va a encontrar una solución mediante la combinación de estas cinco respuestas:

Ejecución De Prueba

Primero ejecute el comando sin rm (quitar) opción para asegurar la correcta archivos que se encuentran:

$ find /usr/local/bin/ /bin/ -printf '%P\n' | sort | uniq -d | tail -n +2 | awk '{print "/bin/" $0}'

/bin/.auto-brightness-config
/bin/auto-brightness-config
/bin/bell
/bin/bell/bell-select-menu
    ( ... OUTPUT SHORTENED ... )

Cómo funciona

find devuelve los nombres de los archivos en el Directorio 1 (/usr/local/bin), seguido por el Directorio 2 (/bin(:

Directorio de 1 Archivos sin ningún orden en particular

  • bbbbb
  • aaaaa
  • yyyyy

Directorio de 2 Archivos en ningún orden en particular

  • echo
  • aaaaa
  • zcat
  • bbbbb
  • egrep
  • yyyyy

sort ordena los dos directorios' los nombres de archivo por orden alfabético

  • aaaaa
  • aaaaa
  • bbbbb
  • bbbbb
  • echo
  • egrep
  • yyyyy
  • yyyyy
  • zcat

uniq -d informes sólo los duplicados

  • aaaaa
  • bbbbb
  • yyyyy

Esto nos da una lista de Directorio 1 nombres que fueron accidentalmente se copian en el Directorio 2. Pero hay una línea en blanco en la parte superior de la lista.

tail -n +2 eliminado la línea en blanco en la parte superior de la lista.

awk '{print "/bin/" $0}' antepone /bin/ a cada nombre de archivo, así tenemos:

  • /bin/aaaaa
  • /bin/bbbbb
  • /bin/yyyyy

Anexar la rm comando para tubería

Ahora que hemos confirmado la salida es correcta anexar la rm comando via xargs. Nota si tiene nombres de archivo con caracteres especiales leer el cuarto enlace de arriba para un manejo excepcional.

$ find /usr/local/bin/ /bin/ -printf '%P\n' | sort | uniq -d | tail -n +2 | awk '{print "/bin/" $0}' | xargs rm -f
rm: cannot remove '/bin/.auto-brightness-config': Permission denied
rm: cannot remove '/bin/auto-brightness-config': Permission denied
rm: cannot remove '/bin/bell': Is a directory
rm: cannot remove '/bin/bell/bell-select-menu': Permission denied

El Permission denied de error aparece porque debemos usar sudo poderes para ejecutar el comando. Nota: el error '/bin/bell' is a directory. Después tendremos que eliminar manualmente el directorio rm -d comando.

sudo poderes necesarios para /bin directorio.

La razón niega el permiso de errores es porque root es propietario de los archivos en /bin queremos eliminar y regular de nuestro ID de usuario no puede eliminarlos.

Nota dependiendo de cómo se copian los archivos en el directorio de destino que usted no necesita necesita sudo poderes para eliminarlos. Por ejemplo, si usted está definido como el propietario de los archivos en el directorio de destino.

Ahora vamos a ejecutar el comando con sudo poderes:

$ find /usr/local/bin/ /bin/ -printf '%P\n' | sort | uniq -d | tail -n +2 | awk '{print "/bin/" $0}' | sudo xargs rm -f
rm: cannot remove '/bin/bell': Is a directory
rm: cannot remove '/bin/bell/sounds': Is a directory
rm: cannot remove '/bin/startup-scripts': Is a directory
rm: cannot remove '/bin/zap': Is a directory
rm: cannot remove '/bin/zap/Assembly-Intro-hello': Is a directory
rm: cannot remove '/bin/zap/Assembly-Intro-hello/BeOS': Is a directory
rm: cannot remove '/bin/zap/Assembly-Intro-hello/FreeBSD': Is a directory
rm: cannot remove '/bin/zap/Assembly-Intro-hello/Linux': Is a directory

75 los archivos han sido eliminados, pero el 8 de vacío sub-directorios a la izquierda para quitarlo. Utilizamos la -r recursiva opción de con rm comando para eliminar de ellos:

$ find /usr/local/bin/ /bin/ -printf '%P\n' | sort | uniq -d | tail -n +2 | awk '{print "/bin/" $0}' | sudo xargs rm -rf

No se informó así que no hay más errores!

Resumen

El objetivo de esta respuesta es no sólo para solucionar el problema a la mano, pero mostrar al lector cómo un problema puede ser resuelto mediante la comprobación de múltiples respuestas existentes en el Intercambio de la Pila.

4voto

Mark Puntos 1

Su método es grande, pero se ve demasiado largo.

Mientras que la transformación de Linux Mint para Ubuntu he utilizado el comando como:

sudo find /bin -type f -exec dpkg -S {} \; 2> ~/Desktop/not-in-apt.out

y como el resultado de su caso le pongo mal copiado los archivos de la lista en ~/Desktop/not-in-apt.out.

A continuación, puede revisar el archivo y eliminar los archivos que aparecen en ella. O el uso de algunos de secuencias de comandos para la eliminación.

Para estar completamente seguro de que todos los archivos restantes en /bin son normales se pueden volver a instalar combinando dpkg -S /bin con apt-get install --reinstall con algo como

sudo apt-get install --reinstall $(dpkg -S /bin | sed 's|: /bin||' | sed 's/,//g')

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: