duda bash

Hola, tras muchos años usando linux he decidido aprender bash para mejorar conseguir el control completo de mi sistema, y practicando pensé hacer un scrip que buscase en un directorio los archivos que pesasen un determinado tamaño y los mostrase, mi duda es como puedo hacer que bash vaya recorriendo la carpeta fichero por fichero, ya que con ls me muestra todos de golpe y lo suyo sería guardar el nombre de uno en una variable, operar con el, y saltar al siguiente de forma individual. Gracias por adelantado.
for file in "$dir"/*; do
   #Insertar código, se accede a la variable con $file (recuerda que en la lista se incluirán los directorios dentro de $dir)
done


De todos modos si lo vas a hacer por algo más que practicar esa tarea se hace con el comando find. Aprender a usar bash es más aprender a usar las herramientas del sistema y empalmarlas entre ellas que hacer algoritmos (alias, la filosofía Unix). Para aprender programación seria sería mejor idea mirar Ruby, Python, C u otra cosa similar.

En el camino de defenderte con los métodos arcanos y misteriosos de bash te vendrán bien el manual de TLDP, la wiki de Bash Hackers y la de Greg's Wiki, en especial su sección de errores comunes. Happy hacking.
John_Wheel escribió:
for file in "$dir"/*; do
   #Insertar código, se accede a la variable con $file (recuerda que en la lista se incluirán los directorios dentro de $dir)
done


De todos modos si lo vas a hacer por algo más que practicar esa tarea se hace con el comando find. Aprender a usar bash es más aprender a usar las herramientas del sistema y empalmarlas entre ellas que hacer algoritmos (alias, la filosofía Unix). Para aprender programación seria sería mejor idea mirar Ruby, Python, C u otra cosa similar.

En el camino de defenderte con los métodos arcanos y misteriosos de bash te vendrán bien el manual de TLDP, la wiki de Bash Hackers y la de Greg's Wiki, en especial su sección de errores comunes. Happy hacking.


Yo tambien, quiero hacer algo parecido a lo de el, pero en mi caso, es que hay dos cosas: una es el nombre de un archivo y la otra de una imagen con el mismo nombre, pero terminando en .png

Si el archivo existe, la imagen se queda, y sino, entonces la imagen se va.

Y aparte de eso, que me diga la cantidad de imágenes que se fueron y cuanto espacio ocupaba la misma.

Se que suena un poco lioso para mi, incluso, tengo la idea de como sacar los cálculos de las imgs, pero lo que no se muy bien, es como implementar eso que quiero.

Creo que me vendrá bien esas paginas que haz publicado.
Empezaría con for file in "$dir"/*.png; do para coger las posibles fotos a eliminar.
Tras eso hay que cortarle el .png del nombre, que es la parte dura. La documentación de manipulación de subcadenas de bash, como poco, intimida. En este caso la opción más sencilla parece ${string/%a/b}, que hace que si la cadena $string acaba en a cambie a por b. En este caso ${file/%.png/}, que cambia .png por nada.
Para comprobar si un fichero existe se usa if [ -e $file ], y ! para negarlo, así que se quedaría en if [ ! -e $file ].

Debería ser algo así:
for file in "$dir"/*.png; do
   if [ ! -e "${file/%.png/}" ]; then
      rm "$file"
   fi
done

El tamaño de un archivo se saca con du y (hasta donde sé) tendrás que recortar el número con cut, awk o sed (en orden ascendente de hardcodidad).
La cantidad de imágenes es cuestión de sumar uno a una variable cada vez que borras un fichero.
Y por supuesto no añadas el rm de verdad o no uses el script donde tienes planeado usarlo hasta que hayas comprobado que funciona bien y borra sólo lo que tiene que borrar.

Aunque las especificaciones son un poco raras. A menos que sea la carpeta de datos de una aplicación compleja quizás haya una forma más sencilla.
No tengo mucho que añadir. Pero, aún (creo) siendo menos potente, si uno se lía con la sentencia "${file/%.png/}", siempre se puede usar basename, que lo veo bastante intuitivo :). Sería cambiar eso por `basename $file .png`, así toma el nombre de $file (sin rutas absolutas) y le quita .png.

Salu2!!!
Hola de nuevo, gracias por la ayuda me sirvió de mucho, ahora me salio otra con la que estoy un poco mareado quisiera hacer un echo {a..z}{a..z} con tantos {a..z} como indique el usuario, pero no me sale , intento guardar en variables y error y no se que puedo hacer, tambien me gustaria ir analizando 1 a 1 el resultado de eso osea si tenemos aa ab ac coger aa guardarlo en una variable h hacer pruebas con el, si podeis ayudarme os estaría eternamente agradecido.
En respuesta a la pregunta inicial, lo más tipico y fácil sería con find, ejemplo:

find /usr/bin/ -size +6M -exec ls -lh {} \;


(busca y lista en /usr/bin los archivos con tamaño > 6 Mb)

Sobre los comentarios posteriores de nombres y demas, también se puede con el propio find (parámetros -name)
6 respuestas