¿Por qué "sudo cp" no puede encontrar los archivos?

¿Por qué "sudo cp" no puede encontrar los archivos?

¿Quién puede darme una explicación lógica a este problema?

No puedo ejecutar este comando:

sudo cp /data/*20150522* /backup/

cp: cannot stat `/data/*20150522*': No such file or directory

Y cuando cambio a root, funciona sin problemas.

Estoy seguro de que se trata de tener los privilegios adecuados para enumerar los archivos dentro del directorio/data que tienen los siguientes privilegios de acceso:

drwxrwx--- 1 root root 

Pero aquí estoy ejecutando el comando con sudo, entonces, ¿cuál es el problema aquí?

Respuesta1

El shell intenta expandir el patrón global antes de pasar el resultado expandido a cp(en realidad, está pasando el resultado al sudocual luego lo pasa sin cambios a cp). Dado que el shell (se ejecuta como usted, no como root) no puede atravesar el directorio, cptermina recibiendo el patrón no expandido en su lista de argumentos.

cpno realiza ninguna expansión global por sí mismo. Espera una lista de nombres de archivos. La cadena con el patrón no nombra ningún archivo.

Quizás la forma más sencilla de realizar la tarea sea invocar su comando en un subshell. Cita el comando con comillas dobles ( ") o comillas simples ( ').

sudo sh -c "cp /data/*20150522* /backup/"
sudo sh -c 'cp /data/*20150522* /backup/'

Esto funciona porque el subshell expande el patrón global en la cadena de comando antes de invocar el comando. Dado que el subshell se ejecuta como root en sudo, la expansión se realiza correctamente.

El uso de comillas dobles para citar el comando en el subshell permite que el shell principal expanda las variables del shell antes de invocar el sudocomando. Si desea que el subshell expanda las variables, se deben utilizar comillas simples. En este caso es equivalente, ya que no tienes ninguna variable. Pero podrías agregar uno para ver la diferencia de comportamiento.

sudo sh -c "echo $USER; cp /data/*20150522* /backup/"
sudo sh -c 'echo $USER; cp /data/*20150522* /backup/'

El primer comando mostrará su nombre de usuario, mientras que el segundo comando mostrará el nombre de usuario raíz.

información relacionada