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.

Scott
fuente
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 \;
Mereghost
fuente
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 ...

Chris
fuente
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 \;
teancum144
fuente
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

Shawor
fuente
-1

puedes usar find

find * -maxdepth 1 -type f -exec mv {} ~ \;
John T
fuente
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

Cm57201
fuente
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