Cómo mover solo archivos en Unix


18

¿Cómo puedo mover solo los archivos simples (no los directorios) de una carpeta en Linux a otra carpeta usando el mvcomando?

Lo intenté mv * ~/, pero copió todo, incluidos los directorios.


sus comentarios mencionan una restricción adicional: el comando no debe mover archivos ocultos del directorio de trabajo actual. Si esto es correcto, ¿podría editar su pregunta para mencionar esto? decir "mover solo archivos" nos hace pensar "mover todos los archivos", que incluye archivos ocultos.
quack quijote

Respuestas:


29

Puedes probar

find . -maxdepth 1 -type f -exec mv {} destination_path \;

2
Wow, alguien que sabe usar find. Para completar, debe usar -name [^.] * En la búsqueda, es decir, --- encontrar. -maxdepth 1 -type f -name [^.] * -exec mv {} ruta \;
Chris

NO COPIE Y PEGUE ESTO EN SU CONCHA. El punto y coma hará que se ejecute inmediatamente. :)
Sherwood Callaway

@SherwoodCallaway El punto y coma es para marcar el final de-exec
dstonek

4

Soy un tipo de "usa un martillo para todo", así que uso programas de shell bourne para cosas que otros usan programas externos para ...

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

A algunas personas les gusta hacer las cosas con la menor mecanografía posible, pero soy un mecanógrafo bastante rápido y tengo cosas como esta incorporadas en mi cerebro, por lo que no es demasiado doloroso hacer esto en lugar de buscar exactamente argumentos para encontrar y ejecutar y todo eso.

YMMV, aunque ...


Gracias por eso lo intentaré. pero todavía necesito la otra respuesta porque es para un proyecto que estoy haciendo en el curso de Linux. muchas gracias

1
Esta es una respuesta a tu pregunta. mv no tiene conocimiento de archivos o directorios o fifos u otros archivos especiales. mv solo comprende entradas de directorio e inodos, y en lo que a él respecta, todos son iguales independientemente del tipo de archivo. Para permitir que mv solo mueva un tipo específico de archivo, necesita algo como probar o encontrar que realmente pueda mirar el inodo para ver qué es el archivo. En otras palabras, se le está haciendo una pregunta con trampa si se le pide que lo haga solo con mv.
Chris

1
Y digo que mv entiende los inodos solo porque es capaz de mover un archivo de un sistema de archivos a otro, que técnicamente es un cp y luego un rm, no un mv (que en realidad es solo un ln y luego rm). Busque enlaces duros y entradas de directorio.
Chris

2
Resumiendo: Esta es una buena respuesta, tienes que usar algo además del comando mv (al menos el shell). Esto se trata de lo básico que se obtiene sin programación.
Kyle Brandt el

3

@Mereghost está muy cerca. Esto es lo que consigo para mover todos los archivos (incluidos los archivos ocultos), pero no los directorios:

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

El .hallazgo después asume que el directorio actual es el origen de los archivos que desea mover. Si no, el comando se puede revisar de la siguiente manera:

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

Si desea mover solo archivos normales y no archivos ocultos:

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

Si desea mover solo archivos ocultos y no archivos normales:

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;

0

Si no tiene carpetas con el nombre con un punto, puede moverlas todas simplemente:

mv . ~ / carpeta de destino

(Supongo que todos sus archivos son algo. Algo (en mi caso, todos son generalmente))

PERO gracias a otras respuestas, muy útil. Gracias


-1

puedes usar find

find * -maxdepth 1 -type f -exec mv {} ~ \;

Sí, bueno, eso funcionó, pero no al 100%, copió todos los archivos de directorios y subdirectorios a ~ / location. Necesito algo muy básico que copie los archivos sin los archivos ocultos del directorio en el que estoy en otro directorio. Eso es. gracias por el consejo de todos modos

Eso es imposible con una profundidad máxima de 1.
John T

corregido para que no copie archivos ocultos.
John T

1
La sintaxis en find es find a continuación, un directorio y luego una descripción de las operaciones y las cosas que deben coincidir. Uno normalmente no usaría jamás un comodín como tal hallazgo * sin que lo protege de comodines (es decir, encontrar / ruta / al / directorio -nombre baba * type f.
Chris

1
Buscar solo funciona correctamente si le da un solo camino para examinar. En su ejemplo, por ejemplo, si hay algún archivo que comience con un - find explotará inesperadamente. Siempre es mucho mejor que solo un programa lea la entrada del directorio y, en su ejemplo, utiliza dos programas diferentes (find y el shell).
Chris

-2

mv `find ./sourcedir/* -type f` ./destdir


2
Esto fallará para cualquier archivo que contenga espacios en blanco en su nombre. La salida de comandos que imprimen nombres de archivo nunca debe analizarse a menos que se pueda garantizar que esté delimitada correctamente. Vea Por qué no debería analizar la salida de ls (1) para la idea principal. Usar findla -execopción es la mejor manera de evitar el problema.
slhck
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.