archivos mv con | xargs

18

Solo estoy tratando de mover un montón de archivos (no enlaces simbólicos) de mi carpeta / etc / apache / sites-enabled a la carpeta / etc / apache / sites-available con lo siguiente:

/etc/apache2/sites-enabled$ find . -maxdepth 1 -type f | xargs mv {} ../sites-available/

pero soy un ubuntu n00b y obtengo este error:

mv: target `./real-file' is not a directory

donde 'real-file' es un archivo de prueba que configuré en mi entorno de desarrollo. Estoy tratando de ordenar el desorden de otra persona en un servidor de producción ;-)

Robar
fuente

Respuestas:

27

Puedes probar la -execopción con el findcomando,

/etc/apache2/sites-enabled$ sudo find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \;

Para mover archivos propiedad de root, necesita sudopermisos.

Si desea usar el xargscomando, agregue la -Iopción.

find . -maxdepth 1 -type f | sudo xargs -I {} mv {} /etc/apache2/sites-available/
Avinash Raj
fuente
7

Idealmente, debería usar -print0 con find, para que los nombres de archivo con espacios no arruinen las cosas.

Por ejemplo, esto debería funcionar:

find . -whatever-flags-go-here -print0 | xargs -r0 mv -t target-directory
David Goodwin
fuente
0

También puede usar otra forma de realizar lo mismo pero con un rendimiento adicional :

find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \+

Tenga en cuenta que termina con los \+medios para que el comando find obtenga el resultado y se expanda para {}hacer lo que desea, de esta manera evita las dos opciones ( \;= para cada entrada Y canalización en un nuevo comando xargs)

Aquí está la explicación (también puede consultar el manual man find)

-exec command {} + Esta variante de la acción -exec ejecuta el comando especificado en los archivos seleccionados, pero la línea de comando se crea agregando cada nombre de archivo seleccionado al final; El número total de invocaciones del comando será mucho menor que el número de archivos coincidentes. La línea de comando se construye de la misma manera que xargs construye sus líneas de comando. Solo se permite una instancia de '{}' dentro del comando. El comando se ejecuta en el directorio de inicio.

gonzalesraul
fuente