Como pasar varias carpetas o archivos por comandos en la terminal

Buenas a tod@s, tengo la siguiente duda y por mas que eh buscado por la red no encuentro lo que quiero hacer.

Tengo una usb donde hay varias carpetas y archivos, pero quiero pasar solo las carpetas, solo que son 13.

Se que se usa el comando "cp" (para copiar) y "mv" (para mover), ahora si quiero mover todas las carpetas o copiarlas tendria que hacer lo siguiente:

cp dir1 dir2 dir3 (para copiar)
mv dir1 dir2 dir3 (para mover)

Eh aqui el lio, son 13 carpetas y ya se pueden imaginar escribir "mv (y los 13 nombres de las carpetas), asi que en mi caso hay algo y las carpetas que quiero pasar estan enumeradas (1. Documentos, 2. Papeleria, 3. PDF, etc).

Encontre algo no me acuerdo exactamente si es asi, el lio es que me pasa todo hasta los archivos sueltos y solo quiero pasar las 13 carpetas....

mv /home/media/USB/* /home/wilivarob/Documentos (aqui tengo entendido que con el * me pasaria todo.

Teniendo en cuenta ya mi ejemplo, mi siguiente duda es como se haria si las carpetas no estuvieran enumeradas.

Por adelantado muchas gracias.
no me queda claro si están numeradas o no, si están numeradas no debería de ser muy complicado hacer una expresión regular que te las coja, sino un script en un bucle.

Sino están numeradas y quieres siempre copiar las mismas carpetas, pues un script para copiar una a una, y ya está.

No tendrás que escribir siempre las mismas tediosas lineas.

También puedes mirar rsync para la copia
Y por algo en especial no puedes usar mc (midnight commander) en la terminal? es un gestor de archivos como el antiguo comandante norton de dos. Marcas las carpetas en un panel y copias en el destino que haya en el panel contrario.

Imagen
@Darumo Venía a recomendar también el mc.
Pones el origen en un panel, el destino en otro, vas selecionando las carpetas con la tecla insert y luego las copias con F5 o las mueves con F6
nu_kru escribió:no me queda claro si están numeradas o no, si están numeradas...


gracias por responder y si estan enumeradas, pero igual quiero saber el dia de mañana como haria si no estubiera enumeradas, en cuanto al script, amigo no tengo idea de que me hablas, pero igual te agradesco el aporte de ayudarme

Darumo escribió:Y por algo en especial no puedes usar mc (midnight commander)....


Mi querido colega me alegra que sigas ayudandome, la verdad todo lo que me has dicho es confiar a ojos cerrados [tadoramo] [tadoramo] , tendria que mirar en si como funciona, buscare un poco mas para saber como se usaria.

aunque me dieron un dato interesante y es hacer lo siguiente:

mv /home/media/USB/*/ /home/wilivarob/Documentos


El "/" despues del * me permite al parecer pasar todas las carpetas dejando los archivos quietos, hasta ahi perfecto, pero que si quiero dejar una carpeta, en el ejemplo mencionado por ahora tengo 13 carpetas enumeradas y tal vez el comando funcione, pero si quiero pasar solo 12 carpetas????

lecquio escribió:@Darumo Venía a recomendar también el mc....


Gracias amigo, como lo mencione tendria que averiguar si mi debian lo tiene instalado, si no como instalarlo, a ver que onda, pero si me gustaria hacerlo desde consola con comandos.
No suele venir mc por defecto preinstalado.

Pero vamos lo instalas en dos segundos.

sudo apt-get install mc

y ya podrás ejecutarlo con el comando mc.

Te va a facilitar mucho las cosas, ya que además de ver 2 directorios simultáneamente tiene para copiar, mover, borrar, renombrar y diversas tareas habituales en el manejo de archivos.

Y en modo gráfico/escritorio uso krusader.

En el comando que pusiste antes el "*" equivale a "lo que sea", pero puedes ponerle por delante o detrás letras, si pones dcm* equivaldrá a todo lo que empiece por dcm por ejemplo. Lo que quieres en cambio es selectivo y no tengo claro como hacerlo ya que creo que implicaría hacer un script o algo.
Darumo escribió:No suele venir mc por defecto preinstalado.....


Gracias colega por la info, como lo eh mencionado quiero manejarlo todo por terminal, nada gráfico y por lo visto lo que quiero se complica un poco así que el porcentaje al instalar el "mc" ya va al 80%...

Solo estoy por confirmar este código me enviaron pero estoy esperando respuesta de que es lo que hace cada sección:
ls -D /home/media/USB/ | grep -v -E "^5" | while read -r archivo; do mv "/home/media/USB/$archivo" /home/wilivarob/Documentos/; done
 

Este código al parecer copia todas las carpetas excepto la 5, a un ejemplo que supuse....
No sientes curiosidad por ti mismo de aprender que es cada cosa? busca un poco de información sobre estructuras de control de bash, pipe |, y los distintos comandos que se van ejecutando
mv $(find /PATH/DIR_A* -prune -type d) PATH_DIR_B


http://www.unix.com/shell-programming-and-scripting/249579-move-only-folders-skipping-files.html

how to move only directories linux ---->Google

:)
wilivarob escribió:
Darumo escribió:No suele venir mc por defecto preinstalado.....


Gracias colega por la info, como lo eh mencionado quiero manejarlo todo por terminal, nada gráfico y por lo visto lo que quiero se complica un poco así que el porcentaje al instalar el "mc" ya va al 80%...

Solo estoy por confirmar este código me enviaron pero estoy esperando respuesta de que es lo que hace cada sección:
ls -D /home/media/USB/ | grep -v -E "^5" | while read -r archivo; do mv "/home/media/USB/$archivo" /home/wilivarob/Documentos/; done
 

Este código al parecer copia todas las carpetas excepto la 5, a un ejemplo que supuse....


eso mueve todo tipo de archivos pertenecientes a ese directorio excepto los que cuyo nombre empieza por "5"
Por aquí tienes una forma un poco mas enrevesada.

for i in `ls -l /PATH/DIR_A/ | grep ^d | awk '{ print "/PATH/DIR_A/"$9 }'`; do cp $i /PATH/DIR_B/ ; done
nu_kru escribió:No sientes curiosidad por ti mismo de aprender que es cada cosa?....


Gracias por responder, y si amigo estos dias eh estado leyendo sobre regex...

kyo2009 escribió:
mv $(find /PATH/DIR_A* -prune -type d) PATH_DIR_B



Gracias por responder, el codigo funciona pero para pasar todas las carpetas pero si no quiero pasar 1 o 2??

usuario_casual escribió:eso mueve todo tipo de archivos pertenecientes a ese directorio excepto los que cuyo nombre empieza por "5"


Gracias amigo por responder, con unos cambios que se le hicieron se logro cumplir el objetivo

ls -d /home/media/USB/*/ | grep -v -E "5" | while read -r archivo; do mv "$archivo" /home/wilivarob/Documentos/; done


con este codigo sirvio para pasar todas las carpetas excepto la carpeta con el nombre de "5", aunque no eh logrado hacer que no pasen 2, o bueno si lo logre pero me dijeron que no era la forma correcta y muy raro que me haya funcionado y fue añadirlo asi
| grep -v -E "5" | grep -v -E "Otros" |

Asi no pasarian las carpetas que se llaman "5" y "Otros"

KePeRHeLL escribió:Por aquí tienes una forma un poco mas enrevesada.

for i in `ls -l /PATH/DIR_A/ | grep ^d | awk '{ print "/PATH/DIR_A/"$9 }'`; do cp $i /PATH/DIR_B/ ; done


Gracias amigo por responder, Veo que es similar al que puse, solo que no veo donde pondria las carpetas que no quiero que pasen
no es la forma correcta porque ejecutas dos procesos grep uno detras de otro
prueba así

ls -d */ | grep -v  -E "5|Otros"
usuario_casual escribió:no es la forma correcta porque ejecutas dos procesos grep uno detras de otro
prueba así

ls -d */ | grep -v  -E "5|Otros"


Si eso me han informado, lo curioso es que me funciona, en cuanto a la forma en que me dices, no estoy muy seguro pero casi.... que ya lo hice asi y no me funciono, a penas tenga la oportunidad de probarlo te cuento si funciono.

Gracias.
Aquí estamos dando opciones cuando realmente ¿Qué es lo que quieres copiar un numero determinado de carpetas? ¿Copiar saltandote algunas? ¿Copiar solo algunas seleccionadas?

Es que depende de lo que quieras se puede hacer de una forma u otra.
kyo2009 escribió:
mv $(find /PATH/DIR_A* -prune -type d) PATH_DIR_B


Gracias por responder, el codigo funciona pero para pasar todas las carpetas pero si no quiero pasar 1 o 2??


mv $(find  PATH_A* ! -regex '.*\(DIR1\|DIR2\|DIR_N\)$' -prune -type d) PATH_B


:)
KePeRHeLL escribió:Aquí estamos dando opciones cuando realmente.....


Gracias amigo por responder y la idea principal del tema era pasar 13 carpetas de 14 y que no pasar unos archivos sueltos, poco a poco se expandió un poco el tema y se fue exponiendo comandos las cuales pasaban solo carpetas y así sucesivamente..... Pero para mí es interesante saber que cada parte de la estructura de un código postiado aquí se puede utilizar para otras cosas que para mí es del día a día.....

kyo2009 escribió:
mv $(find  PATH_A* ! -regex '.*\(DIR1\|DIR2\|DIR_N\)$' -prune -type d) PATH_B

:)


Gracias amigo, ahora lo probaré es mucho más fácil al que postie, también miraré a ver si funciona con archivos sueltos como por ejemplo imágenes .PNG, .txt , etc..... Por último amigo me podría leer el código a lo que me refiero es que hace cada cosa, me imagino que dónde dice "PATH_A" va la ruta de la carpeta origen y "PATH_B" sería destino???

En "DIR1\DIR2" irían las carpetas, allí pondré los archivos sueltos a ver ......
wilivarob escribió:
KePeRHeLL escribió:Aquí estamos dando opciones cuando realmente.....


Gracias amigo por responder y la idea principal del tema era pasar 13 carpetas de 14 y que no pasar unos archivos sueltos, poco a poco se expandió un poco el tema y se fue exponiendo comandos las cuales pasaban solo carpetas y así sucesivamente..... Pero para mí es interesante saber que cada parte de la estructura de un código postiado aquí se puede utilizar para otras cosas que para mí es del día a día.....

kyo2009 escribió:
mv $(find  PATH_A* ! -regex '.*\(DIR1\|DIR2\|DIR_N\)$' -prune -type d) PATH_B

:)


Gracias amigo, ahora lo probaré es mucho más fácil al que postie, también miraré a ver si funciona con archivos sueltos como por ejemplo imágenes .PNG, .txt , etc..... Por último amigo me podría leer el código a lo que me refiero es que hace cada cosa, me imagino que dónde dice "PATH_A" va la ruta de la carpeta origen y "PATH_B" sería destino???

En "DIR1\DIR2" irían las carpetas, allí pondré los archivos sueltos a ver ......


Si, sobre el PATH . Para archivos tendrás que cambiar el flag
d
por
f
. Saludos.

PD:
man find
kyo2009 escribió:
wilivarob escribió:
KePeRHeLL escribió:Aquí estamos dando opciones cuando realmente.....


No me funciono, aqui te dejo lo que hice....

cp -r $(find /media/wilivarob/USB/* ! -regex '.*\(Otros\|5. Software\)$' -prune -type d) /home/wilivarob/pruebas/


Gracias de todas formas...
Tal vez sea más fácil con rsync:
rsync -avh --exclude 'directorio' --exclude 'archivo1' origen/ destino/

http://www.thegeekstuff.com/2011/01/rsy ... feedburner
wilivarob escribió:
usuario_casual escribió:no es la forma correcta porque ejecutas dos procesos grep uno detras de otro
prueba así

ls -d */ | grep -v  -E "5|Otros"


Si eso me han informado, lo curioso es que me funciona, en cuanto a la forma en que me dices, no estoy muy seguro pero casi.... que ya lo hice asi y no me funciono, a penas tenga la oportunidad de probarlo te cuento si funciono.

Gracias.

¬_¬ ¿no te funciona?
yo no soy adivido y no das más información, así que te lo dejo lo mejor que puedo y ya te sacas las castañas tu mismo ya que a mi me funciona así como todas las opciones que te han comentado, suerte y animo.

ls -d /media/wilivarob/USB/*/ | grep -v -E "Otros|5. Software" | while read nombre;do cp -r "$nombre" /home/wilivarob/pruebas/;done
wilivarob escribió:
No me funciono, aqui te dejo lo que hice....

cp -r $(find /media/wilivarob/USB/* ! -regex '.*\(Otros\|5. Software\)$' -prune -type d) /home/wilivarob/pruebas/


Gracias de todas formas...

Prueba así sin el asterisco después de USB/
cp -r $(find /media/wilivarob/USB/ ! -regex '.*\(Otros\|5\.\ Software\)$' -prune -type d) /home/wilivarob/pruebas/


Te puse la barra invertida en el punto pero no se si es un punto de sustitución de carácter o que el nombre tiene el punto. Y los espacios también hay que poner la barra invertida.

No me funciono, aqui te dejo lo que hice....

cp -r $(find /media/wilivarob/USB/* ! -regex '.*\(Otros\|5. Software\)$' -prune -type d) /home/wilivarob/pruebas/


Gracias de todas formas...

No sé si es idea mía o nada de lo que te postean "funciona" , yo veo perfectamente en la imagen que se excluyen los directorios pasados a regex, y solo se copia el directorio "otra_carpeta".

Imagen
KePeRHeLL escribió:Te puse la barra invertida en el punto pero no.....


Gracias amigo, cuando pueda lo intento a ver.

kyo2009 escribió:No sé si es idea mía o nada de lo que te postean "funciona"......


Gracias amigo, te muestro el que me funciono..

este codigo para pasar todas las carpetas excepto archivos y una carpeta..

ls -d /home/media/USB/*/ | grep -v -E "Otros" | while read -r archivo; do cp -r "$archivo" /home/wilivarob/Documentos/; done


Y este otro lo mismo solo que para NO pasar 2 carpetas y archivos.

ls -d /home/media/USB/*/ | grep -v -E "Otros|5\. Software" | while read -r archivo; do cp -r "$archivo" /home/wilivarob/Documentos/; done
23 respuestas