Foro de elhacker.net

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: wilivarob en 13 Junio 2017, 19:06 pm



Título: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: wilivarob en 13 Junio 2017, 19:06 pm
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.


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: engel lex en 13 Junio 2017, 20:58 pm
Código:
mv /home/media/USB/* /home/wilivarob/Documentos

eso movería todo efectivamente.... pero

Código:
mv /home/media/USB/*/ /home/wilivarob/Documentos

observa el slash luego del asterisco, eso indica carpetas, solo moverá todas las carpetas, dajará los que no son carpetas en el directorio raíz del usb intactos


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: wilivarob en 13 Junio 2017, 22:27 pm
Código:
mv /home/media/USB/* /home/wilivarob/Documentos

eso movería todo efectivamente.... pero

Código:
mv /home/media/USB/*/ /home/wilivarob/Documentos

observa el slash luego del asterisco, eso indica carpetas, solo moverá todas las carpetas, dajará los que no son carpetas en el directorio raíz del usb intactos

Gracias colega por responder pero la duda ahora es la siguiente, teniendo en cuenta que funciona el comando me pasaria todas las carpetas, pero si no quiero pasar una carpeta como podria hacerlo, teniendo en cuenta el ejemplo que mencione, son 13 carpetas pero si solo quiero pasar 12???


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: engel lex en 13 Junio 2017, 23:08 pm
y que factor excluiría a la 13va carpeta?

es decir, no estás siendo especifico, no es como si el comando sabe lo que piensas, yo tampoco...


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: wilivarob en 13 Junio 2017, 23:26 pm
y que factor excluiría a la 13va carpeta?....

Lo que quiero decir es que dado el caso que tuviera que pasar solo 12 carpetas como lo haría, o 10 carpetas.

Si el comando que me indicas pasaría todas las carpetas.


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: engel lex en 13 Junio 2017, 23:33 pm
ok, entiendo que solo quieres pasar una parte... pero repito, no estás siendo especifico


siendo 13 y quieres pasar 10, pueden ser 10 cualquiera? o tienen alguna característica? el codigo no puede leer tu mente, tienes que decidir una característica que las agrupe...

imaginate el siguiente caso...


en un escritorio hay 10 documentos y 13 carpetas llenas de papeles y te digo... "trae 12 carpetas, pero no traigas la equivocada" como decides?


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: wilivarob en 13 Junio 2017, 23:45 pm
ok, entiendo que solo quieres pasar una parte... pero repito, no estás siendo especifico.......

Exacto amigo ese es el hilo y teniendo en cuenta el ejemplo que mencione, como haría para pasar las carpetas del 1 al 12, como haria para pasar todas las carpetas sin la número 5.....

Ten en cuenta que en el ejemplo que doy mis 13 carpetas están enumeradas una carpeta la tengo con el nombre de "1. Documentos" otra ”2. Papeleria", "3. Pdf”, las 13 están enumeradas.



Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: engel lex en 14 Junio 2017, 00:08 am
en este caso es mucho más complejo... como yo lo haría asumiendo que es la capeta cuyo nombre empieza por el numero 5
Código
  1. ls -D /home/media/USB/ | grep -v -E "^5" | while read -r archivo; do mv "/home/media/USB/$archivo" /home/wilivarob/Documentos/; done

ojo que ahí estamos mezclando parametros, inversiones, ciclos y regex XD

pruebalo primero, lo estoy haciendo un poco de mente y no estoy seguro si la sintaxis está 100% bien


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: wilivarob en 14 Junio 2017, 00:48 am
en este caso es mucho más complejo... como yo lo haría asumiendo que es la capeta cuyo nombre empieza por el numero 5.......

Wuauuu amigo ahora si que quede más perdido pero intento entender....

El código que envías haría pasar todas las carpetas excepto la 5, osea el código lo que hace es retener la carpeta 5 y mover el resto.

Podrías decirme que hace cada cosa, se que aunque no tenga idea que hace -D lo demás listaria las carpetas que hay en la USB, el "|", no estoy seguro pero creo que ejecuta algo como en segundo plano?, Por favor me gustaría saber quiero aprender....

Por otro lado donde dice "/home/media/USB/$archivo"  que haría ese "$archivo"


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: engel lex en 14 Junio 2017, 01:06 am
el | sirve para pasar el standar output del lado izquierdo al standard input de la función de la derecha... basicamente toma la salida y la inyecta al siguiente

Código
  1. ls -D /home/media/USB/

lista solo directorios en dicha carpeta

Código
  1. grep -v -E "^5"

grep busca coincidencias, -v invierte lo conseguido, -E indica que vamos a usar REGEX extendido, ^5 indica "algo empezado por 5" en regex

Código
  1. while read -r archivo; do

while es un ciclo, read es una función que permite por -r leer una entrada linea a linea y salvarla en la variable archivo

Código
  1. mv "/home/media/USB/$archivo" /home/wilivarob/Documentos/

esto mueve de la primera ruta, usando la variable archivo como el nombre del archivo, a la segunda ruta

Código
  1. ; done

cierra el ciclo...

esto es aprender poco a poco bash y mezcla cosas que requieren ya algo de conocimiento en lenguajes de programación... por eso te decía que no era ta simple... tienes que aclararle a la pc que quieres excluir y al ser casos puntuales como el que pones, se empieza a volver extenso el asunto


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: wilivarob en 14 Junio 2017, 01:18 am
el | sirve para pasar el standar output del lado izquierdo al standard input de la función de la derecha.....

Me acaba de dejar sin palabras, tendré que tener en cuenta el comando ahora que llegue a casa y ponerlo a prueba, me habían recomendado instalar midnight commander, pero la verdad pensé que al hacerlo por comandos no fuera tan extenso y peor aún saber programación, pero bueno nunca es tarde para aprender.....

Muchas gracias amigo


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: engel lex en 14 Junio 2017, 01:24 am
prueba por lo menos

imagina que tienes una carpeta done hay 5 archivos
Código:
ls
archivo1.x cosas.y hola1.x hola2.x hola3.x

si usas grep sin más argumentos te filtra de manera simple buscando cualquier coincidencia

Código:
ls | grep hola
hola1.x hola2.x hola3.x


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: wilivarob en 14 Junio 2017, 04:25 am
prueba por lo menos.....

Mi querido colega, te cuento que estoy muy sorprendido, eh echo lo del comando

Código:
cp -r /home/media/USB/*/


y efectivamente me paso todas las carpetas con sus archivos, pero me paso una carpeta que no queria que tiene el nombre de "Otros", asi que aplique la otra (aplique unos cambios menores, en vez de utilizar "mv" use "cp")...

Código:
ls -D /home/media/USB/ | grep -v -E "^Otros" | while read -r archivo; do cp -r "/home/media/USB/$archivo" /home/wilivarob/Documentos/; done

y vaya que si, solo que en este caso se pasaron archivos sueltos, creei que en esta sección

Código:
 grep -v -E "^Otros"

añadiendole el nombre del archivo suelto que no queria que pasara funcionara

Código:
 grep -v -E "^Otros" "^20170506.png"

pero salta error

"grep: ^20170506.png: No existe el fichero o el directorio"

Pero la verdad es lo que necesito, solo faltaria saber como ir añadiendo a ese comando lo que no quiero que pase.

NOTA: Eh estado haciendo unas pruebas y la unica que me funciono fue la siguiente, no se si exista algun metodo mas corto....

Código:
| grep -v -E "^Otros" | grep -v -E "^20170506.png" |

Ahora otra cosa que me quedo sonando y es que este comando

Código:
ls -D /home/media/USB/

la "-D", me deberia mostrar solo directorios (me imagino carpetas), y al aplicarlo me sale todo como si solo aplicara "ls", es como si "-D" no aplicara



Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: engel lex en 14 Junio 2017, 05:23 am
no grep debes pasarle un solo argumento, si pasas un segundo es un archivo a leer... y es harina de otro saco

me equivoqué en algo... era
Código:
ls -d

el principio, con d minúscula

si quisieras coincidir multiples reglas en regex usas por ejempl

Código:
grep -v -E "^Otros|^20170506\.png"

tienes que usar backslash para todo simbolo (como el punto y especialmente el punto, si no quieres caos) y usas barra para separar las reglas


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: wilivarob en 14 Junio 2017, 05:59 am
no grep debes pasarle un solo argumento, si pasas un segundo es un archivo a leer... y es harina de otro saco.....

Bueno amigo acabo de hacer el proceso y te cuento lo siguiente, por un lado en cuanto a

Código:
ls -D
a
Código:
ls -d
es que el primero muestra todo y el segundo solo aparece un punto (.), o sea no hace lo que mencionaste.

Y en cuanto el codigo

Código:
grep -v -E "^Otros|^20170506\.png"
no se si te equivocaste pero le quite el "\" y lo unico que noto es que se tarda mas de lo que se demoro con el metodo que use yo...


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: engel lex en 14 Junio 2017, 06:21 am
disculpa... con ls -d tienes razón lo puse mal
Código:
ls -d /home/media/USB/*/

en este caso siempre debe llevar el */

sobre el \ si no lo colocas pasa que en regex el punto singifica "cualquier cosa" es decir

si buscas algo que empiece con c y termine con o y tenga cualquier cosa en el medio, usas

Código:
grep  -E "^c.*o$"

por eso debe llevar \


la sentencia correcta para sacar solo directorios exceptuando uno, debería ser

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

esta si la probé y creo que va bien


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: wilivarob en 14 Junio 2017, 20:06 pm
disculpa... con ls -d tienes razón lo puse mal.....

Como esta querido colega, acabo de verificar el ultimo codigo y te cuento lo siguiente, la primera parte
Código:
ls -d /home/media/USB/*/
ahora si me muestra solo carpetas, al procesar todo el comando, los archivos sueltos no aparecen por ejemplo la imagen 20170506.png (esto debido a la primera parte de que solo muestre solo carpetas, hasta ahi todo perfecto), ahora en la parte
Código:
grep -v -E "^Otros"
, se supone que indica que la carpeta "Otros" no deberia pasar, pues aqui es donde ya empieza el error porque me la pasa, incluso vi que modificaste esta parte
Código:
do cp -r "$archivo" /home/wilivarob/Documentos/
le quitaste ""/home/media/USB/" que venia antes de "$archivo" y se lo puse a ver y nada aun....

Lo interesante es que el codigo pasa todas las carpetas sin los archivos sueltos y eso es bueno, pero y la carpeta "Otros" que no quiero???


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: engel lex en 14 Junio 2017, 22:37 pm
Código:
grep -v -E "^Otros"

coincide todo lo que no empiece por otros... si la palabra "Otros" no es con lo que empieze el nombre de archivo,  quitale el  ^ te recomiendo por lo menos leer lo basico de regex


si quieres cambia la parte de
Código:
do cp -r "$archivo" /home/wilivarob/Documentos/

por
Código:
do echo "$archivo"

así ves que le está pasando al cp sin andar dando tumbos de ciego


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: wilivarob en 15 Junio 2017, 05:07 am
Código:
grep -v -E "^Otros"

coincide todo lo que no empiece por otros...

Como estas colega, esta vez te escribo para agradecerte por el comando, esta vez funciono perfectamenta solo era quitar el "^" y solo poner el nombre de la carpeta, asi que muchas gracias, solo te menciono que qice ensañar sacando otra carpeta en este caso "Otros" y "5. Software" y en la parte

Código:
grep -v -E "^Otros"

Añadi como me lo mencionaste y enseñaste
Código:
grep -v -E "^Otros" | "5. Software

y no funciono incluso puse

"^5"
"5\. Software"
"Software"
"^Software"
Casi todas las combinaciones posibles y siempre me saltaba un error de "bash"
solo me funciono asi
Código:
grep -v -E "^Otros" | grep -v -E "5. Software"

De resto excelente exactamente era lo que necesitaba, muchas gracias y espero verte mas adelante, en estos dias publicare unos pequeños problemitas y espero en verdad me puedas ayudar a solucionarlo y pues nada muchas gracias.


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: engel lex en 15 Junio 2017, 05:15 am
me cito

Citar
tienes que usar backslash para todo simbolo (como el punto y especialmente el punto, si no quieres caos) y usas barra para separar las reglas

el espacio es un simbolo (no es letra ni numero)

así que requiere backslash

usualmente se denomina por
Código:
\s

lee sobre regex y no des tumbos de ciego :¬¬ (me molesta personalmente)
Código:
grep -v -E "^Otros" | grep -v -E "5. Software"

te soy sincero y con este caso has tenido suerte XD pero solo sirve si excluyes... además el punto sustituyó el espacio...


regex en wikipedia (https://es.wikipedia.org/wiki/Expresi%C3%B3n_regular) tiene todo lo que necesites saber y mucho más

tambien esto te puede servir mucho
https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/ (https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/)


Título: Re: Como pasar varias carpetas o archivos por comandos en la terminal
Publicado por: wilivarob en 17 Junio 2017, 21:16 pm
me cito
te soy sincero y con este caso has tenido suerte XD pero solo sirve si excluyes... además el punto sustituyó el espacio...

Amigo por fin lo logre....

Código:
grep -v -E "Otros|5\. Software

tocaba pegar los 2 nombres de las carpetas con el "|", no dejar espacios...

Gracias colega.