Dudas de novato usando el shell

Hola

Estoy haciendo unos ejercicios de shell, mas concretamente del bash y tengo una duda que seguro que su solucion está tirada pero no caigo.

Basicamente estoy escribiendo un guion que devuelve el numero de ficheros de cada tipo que hay en el directorio que le paso como parametro. No tengo problemas a la hora de mostrar los ficheros de texto o ejecutables, uso

t=$(file * | grep .txt | wc -l)

echo Hay $t ficheros de texto: $(ls | grep .txt)

Por ejemplo un resultado mostrado por el shell seria:

ubuntu@ubuntu:~/Desktop/fran$ bash ejercicio6.txt "/home/ubuntu/Desktop/Practicas"

La clasificacion de ficheros del directorio /home/ubuntu/Desktop/Practicas es:

Hay 0 ficheros de texto:

Hay 0 directorios:

Hay 19 ficheros ejecutables: comandosshell.pdf PR1-Comparacion-de-comandos.pdf PR3-apuntes_c.pdf PR3-gdb.pdf PR3-llamadas.pdf PR3-make.pdf PR3-prac-smallsh.pdf PR3-smallsh.pdf PR4-aplis.pdf PR4-ayuda-realizacion.pdf PR4-entorno-oso.pdf PR4-enun_prac4.pdf PR4-kernel.pdf PR4-leeme.pdf PR4-mkboot.pdf PR4-multita.pdf TEO-8086tabla.PDF TEO-8086transparencias.PDF TEO-tema9.pdf



Mi duda es, ¿que hago para poder mostrar los directorios dentro del directorio, es decir, las carpetas?. Cuando hago ls no me sale ninguna extension concreta al contrario que con los txt o ejecutables tipo pdf o zip y no se que hacer para filtrar el resultado. ¿Que puedo hacer?

Gracias
naked_snake escribió:Hola

Estoy haciendo unos ejercicios de shell, mas concretamente del bash y tengo una duda que seguro que su solucion está tirada pero no caigo.

Basicamente estoy escribiendo un guion que devuelve el numero de ficheros de cada tipo que hay en el directorio que le paso como parametro. No tengo problemas a la hora de mostrar los ficheros de texto o ejecutables, uso

t=$(file * | grep .txt | wc -l)

echo Hay $t ficheros de texto: $(ls | grep .txt)

Por ejemplo un resultado mostrado por el shell seria:

ubuntu@ubuntu:~/Desktop/fran$ bash ejercicio6.txt "/home/ubuntu/Desktop/Practicas"

La clasificacion de ficheros del directorio /home/ubuntu/Desktop/Practicas es:

Hay 0 ficheros de texto:

Hay 0 directorios:

Hay 19 ficheros ejecutables: comandosshell.pdf PR1-Comparacion-de-comandos.pdf PR3-apuntes_c.pdf PR3-gdb.pdf PR3-llamadas.pdf PR3-make.pdf PR3-prac-smallsh.pdf PR3-smallsh.pdf PR4-aplis.pdf PR4-ayuda-realizacion.pdf PR4-entorno-oso.pdf PR4-enun_prac4.pdf PR4-kernel.pdf PR4-leeme.pdf PR4-mkboot.pdf PR4-multita.pdf TEO-8086tabla.PDF TEO-8086transparencias.PDF TEO-tema9.pdf



Mi duda es, ¿que hago para poder mostrar los directorios dentro del directorio, es decir, las carpetas?. Cuando hago ls no me sale ninguna extension concreta al contrario que con los txt o ejecutables tipo pdf o zip y no se que hacer para filtrar el resultado. ¿Que puedo hacer?

Gracias


Para listar los directorios basta con:

(esta forma me encanta)
file * | grep ".*:.*directory$" | sed -e "s/:.*directory//"

(esta es la mas sencilla y corta)
ls -d */

o
find . ! -name . -prune ! -name '.*' -type d -print
Seguro que hay maneras más elegantes pero la que se me ocurre a mí es la siguiente:

ls -F | grep '/' | cut -f '1' -d '/'


La opción -F añade un identificador al lado de cada archivo y carpeta. El identificador / identifica carpetas, el * archivos ejecutables... Con el grep buscas el identificador / y con el cut cortas el identificador para que te quede únicamente el nombre de las carpetas.

EDIT: Las opciones de feler son, en efecto, más elegantes que la mia.

Saludos:).
Vaya, pues si hay formas, si.

La verdad es que no sabia como hacerlo. Ahora si.

Muchas gracias a los dos. [oki]

Salu2

EDITO: Otra duda de novato. Cuando cuento el numero de ficheros txt con la orden que he puesto arriba me salen el doble porque los ficheros se repiten con un ~ al final (p.ej esta ejercicio1.txt y ejercicio1.txt~) ¿Por que es? ¿Como lo puedo evitar?
naked_snake escribió:EDITO: Otra duda de novato. Cuando cuento el numero de ficheros txt con la orden que he puesto arriba me salen el doble porque los ficheros se repiten con un ~ al final (p.ej esta ejercicio1.txt y ejercicio1.txt~) ¿Por que es? ¿Como lo puedo evitar?


Ésos son ficheros de respaldo hechos por algunos editores de texto y demás. Por ejemplo, gedit hace esas copias por defecto y las guarda cada X minutos.
amuchamu escribió:
naked_snake escribió:EDITO: Otra duda de novato. Cuando cuento el numero de ficheros txt con la orden que he puesto arriba me salen el doble porque los ficheros se repiten con un ~ al final (p.ej esta ejercicio1.txt y ejercicio1.txt~) ¿Por que es? ¿Como lo puedo evitar?


Ésos son ficheros de respaldo hechos por algunos editores de texto y demás. Por ejemplo, gedit hace esas copias por defecto y las guarda cada X minutos.


Y, por tanto, podrías no mostrarlas. El problema esta en la parte de la expresión: grep .txt ya que no verifica que .txt se encuentre al final. Se puede solucionar con grep "\.txt$"
feler escribió:
amuchamu escribió:
naked_snake escribió:EDITO: Otra duda de novato. Cuando cuento el numero de ficheros txt con la orden que he puesto arriba me salen el doble porque los ficheros se repiten con un ~ al final (p.ej esta ejercicio1.txt y ejercicio1.txt~) ¿Por que es? ¿Como lo puedo evitar?


Ésos son ficheros de respaldo hechos por algunos editores de texto y demás. Por ejemplo, gedit hace esas copias por defecto y las guarda cada X minutos.


Y, por tanto, podrías no mostrarlas. El problema esta en la parte de la expresión: grep .txt ya que no verifica que .txt se encuentre al final. Se puede solucionar con grep "\.txt$"

Hola, haciendo un nuevo ejercicio he comprobado que con grep "\.txt$" no consigo filtrar los ficheros de forma que no me aparezcan los que acaban en ~

¿Alguien me dice alguna forma de conseguirlo? Esque estoy probando pero nanai :(

EDITO: Veamos, realmente si muestra por pantalla los ficheros sin ~ pero no los cuenta bien, ya que siempre me devuelve 0 el contador.

La clasificacion de ficheros del directorio /home/fran/Escritorio/franshell es:

Hay 0 ficheros de texto: ejercicio1.txt ejercicio2.txt ejercicio3.txt ejercicio4.txt ejercicio5.txt ejercicio6.txt

Hay 6 directorios: carpeta sin título/ carpeta sin título 2/ carpeta sin título 3/ carpeta sin título 4/ carpeta sin título 5/ ola/

Hay 0 ficheros ejecutables:


El codigo es este

#! bin/bash


if [ "$1" != "" ]
then
  echo
  echo La clasificacion de ficheros del directorio $1 es:
  cd $1
else
  echo
  echo La clasificacion de ficheros del directorio $PWD es:
fi

echo

t=$(file * | grep "\.txt$" | wc -l)

echo Hay $t ficheros de texto: $(ls | grep "\.txt$")

echo

d=$(ls -d */ | wc -l)

echo  Hay $d directorios: $(ls -d */)

echo

e=$(file * | grep -i .pdf | wc -l)

echo Hay $e ficheros ejecutables: $(ls | grep -i .pdf)

echo
naked_snake escribió:
feler escribió:
amuchamu escribió:
Ésos son ficheros de respaldo hechos por algunos editores de texto y demás. Por ejemplo, gedit hace esas copias por defecto y las guarda cada X minutos.


Y, por tanto, podrías no mostrarlas. El problema esta en la parte de la expresión: grep .txt ya que no verifica que .txt se encuentre al final. Se puede solucionar con grep "\.txt$"

Hola, haciendo un nuevo ejercicio he comprobado que con grep "\.txt$" no consigo filtrar los ficheros de forma que no me aparezcan los que acaban en ~

¿Alguien me dice alguna forma de conseguirlo? Esque estoy probando pero nanai :(

EDITO: Veamos, realmente si muestra por pantalla los ficheros sin ~ pero no los cuenta bien, ya que siempre me devuelve 0 el contador.

La clasificacion de ficheros del directorio /home/fran/Escritorio/franshell es:

Hay 0 ficheros de texto: ejercicio1.txt ejercicio2.txt ejercicio3.txt ejercicio4.txt ejercicio5.txt ejercicio6.txt

Hay 6 directorios: carpeta sin título/ carpeta sin título 2/ carpeta sin título 3/ carpeta sin título 4/ carpeta sin título 5/ ola/

Hay 0 ficheros ejecutables:


El codigo es este

#! bin/bash


if [ "$1" != "" ]
then
  echo
  echo La clasificacion de ficheros del directorio $1 es:
  cd $1
else
  echo
  echo La clasificacion de ficheros del directorio $PWD es:
fi

echo

t=$(file * | grep "\.txt$" | wc -l)

echo Hay $t ficheros de texto: $(ls | grep "\.txt$")

echo

d=$(ls -d */ | wc -l)

echo  Hay $d directorios: $(ls -d */)

echo

e=$(file * | grep -i .pdf | wc -l)

echo Hay $e ficheros ejecutables: $(ls | grep -i .pdf)

echo


Obviamente, no te funciona, el error esta aquí:

t=$(file * | grep "\.txt$" | wc -l)


tienes que sutituir file * por ls, quedando asi:

t=$(ls | grep "\.txt$" | wc -l)


:%s/file\ \*/ls/g
feler escribió:
naked_snake escribió:
feler escribió:
Y, por tanto, podrías no mostrarlas. El problema esta en la parte de la expresión: grep .txt ya que no verifica que .txt se encuentre al final. Se puede solucionar con grep "\.txt$"

Hola, haciendo un nuevo ejercicio he comprobado que con grep "\.txt$" no consigo filtrar los ficheros de forma que no me aparezcan los que acaban en ~

¿Alguien me dice alguna forma de conseguirlo? Esque estoy probando pero nanai :(

EDITO: Veamos, realmente si muestra por pantalla los ficheros sin ~ pero no los cuenta bien, ya que siempre me devuelve 0 el contador.

La clasificacion de ficheros del directorio /home/fran/Escritorio/franshell es:

Hay 0 ficheros de texto: ejercicio1.txt ejercicio2.txt ejercicio3.txt ejercicio4.txt ejercicio5.txt ejercicio6.txt

Hay 6 directorios: carpeta sin título/ carpeta sin título 2/ carpeta sin título 3/ carpeta sin título 4/ carpeta sin título 5/ ola/

Hay 0 ficheros ejecutables:


El codigo es este

#! bin/bash


if [ "$1" != "" ]
then
  echo
  echo La clasificacion de ficheros del directorio $1 es:
  cd $1
else
  echo
  echo La clasificacion de ficheros del directorio $PWD es:
fi

echo

t=$(file * | grep "\.txt$" | wc -l)

echo Hay $t ficheros de texto: $(ls | grep "\.txt$")

echo

d=$(ls -d */ | wc -l)

echo  Hay $d directorios: $(ls -d */)

echo

e=$(file * | grep -i .pdf | wc -l)

echo Hay $e ficheros ejecutables: $(ls | grep -i .pdf)

echo


Obviamente, no te funciona, el error esta aquí:

t=$(file * | grep "\.txt$" | wc -l)


tienes que sutituir file * por ls, quedando asi:

t=$(ls | grep "\.txt$" | wc -l)


:%s/file\ \*/ls/g


Ok muchas gracias :) ¿Y por que no funciona con el file? No lo entiendo :S
naked_snake escribió:Ok muchas gracias :) ¿Y por que no funciona con el file? No lo entiendo :S

Porque "\.txt$" comprueba que ".txt" este al final de la linea. Y file pone una descripción del tipo de archivo al final, no el nombre que es lo que nos interesa.
Muchas gracias feler, veo que dominas bastante bien el interprete de ordenes :)

Tengo otra duda a ver si alguien me ayuda.

Estoy tratando de hacer un ejercicio en el cual tengo que comprobar si el numero que le paso al guion como parametro es capicua. Previamente tengo que comprobar si el numero de argumentos es correcto y si es un numero positivo. Un factor muy importante es que no se puede usar la orden rev.

Habia pensado en acceder a cada uno de los numeros del entero pasado como parametro, metiendolo previamente en un array. El caso es que no se como hacerlo, puesto que si le asigno a una variable cualquiera array el $1 (primer parametro de entrada), se le asigna el numero completo y no cada uno de los numeros que lo forman

#! bin/bash

if [ "$1" == "" ]
then
  echo El numero de parametros es incorrecto
  exit 1
fi

if [ "$2" != "" ]
then
  echo El numero de parametros es incorrecto
  exit 1
fi


array_numero=($1)
##No se como seguir puesto que tras la anterior asignacion no he conseguido el array que busco

if echo $1 | grep -x -q "[0-9]\+"
then
  ##Codigo comprobacion capicua
else
  echo Numero incorrecto
  exit 1
fi


¿Alguna solucion a mi problema? ¿Hay formas mejores de hacerlo?

Salu2
naked_snake escribió:Muchas gracias feler, veo que dominas bastante bien el interprete de ordenes :)

Tengo otra duda a ver si alguien me ayuda.

Estoy tratando de hacer un ejercicio en el cual tengo que comprobar si el numero que le paso al guion como parametro es capicua. Previamente tengo que comprobar si el numero de argumentos es correcto y si es un numero positivo. Un factor muy importante es que no se puede usar la orden rev.

Habia pensado en acceder a cada uno de los numeros del entero pasado como parametro, metiendolo previamente en un array. El caso es que no se como hacerlo, puesto que si le asigno a una variable cualquiera array el $1 (primer parametro de entrada), se le asigna el numero completo y no cada uno de los numeros que lo forman

#! bin/bash

if [ "$1" == "" ]
then
  echo El numero de parametros es incorrecto
  exit 1
fi

if [ "$2" != "" ]
then
  echo El numero de parametros es incorrecto
  exit 1
fi


array_numero=($1)
##No se como seguir puesto que tras la anterior asignacion no he conseguido el array que busco

if echo $1 | grep -x -q "[0-9]\+"
then
  ##Codigo comprobacion capicua
else
  echo Numero incorrecto
  exit 1
fi


¿Alguna solucion a mi problema? ¿Hay formas mejores de hacerlo?

Salu2


Podemos dar la vuelta a una cadena de caracteres con sed: sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

$ echo -n "sed" | sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
des
$ echo -n "5234" | sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
4325
12 respuestas