obtener los primeros caracteres del parámetro de expansión del comando de búsqueda

Tengo una gran colección de imágenes y me gustaría colocarlas en carpetas que coincidan con sus primeros 3 caracteres + extensión .jpg.

Así que me gustaría agarrar 4_1_0002.pngel archivo (todos los archivos que comienzan con 4_1) y ponerlo en la 4_1_.jpgcarpeta. Del mismo modo, me gustaría tomar 4_2_0002.pngel archivo (todos los archivos que comienzan con 4_2) y ponerlo en la 4_2_.jpgcarpeta.

Todos esos archivos que me gustaría ordenar están ahora en una carpeta enorme. Esperaba usar un comando de búsqueda, pero no sé cómo extraer los primeros tres caracteres del parámetro de expansión {}.

find . -type f -ok echo mv {} "path/first3char.jpg" \;

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Solo por curiosidad, ¿por qué quieres poner archivos .png en una carpeta con una extensión .jpg, por qué no una carpeta con una extensión .png?
Al principio estaba trabajando con jpg, pero luego cambié a png. No me molesté en cambiar el nombre.

Respuestas (1)

Suponiendo que todos sus archivos están en el mismo directorio y los nombres de archivo son razonablemente sensatos, algo así como

 find . -maxdepth 1 -type f -name '*png' |
     while read line; do
         echo mv "$line" "path/${line:2:3}.jpg/"
     done

Ejecute el comando primero tal como está escrito (incluido el echo) para verificar si el resultado tiene sentido. A continuación, elimine echoy vuelva a ejecutar.

Si bien voté a favor de la respuesta, agregaría una condición en la forma de probar que el directorio existe, por ejemplo, [[ -d path/${line:2:3}.jpg ]]y lo usaría como, por ejemplo, find . -maxdepth 1 -type f -name '*png' | while read line; do [[ -d path/${line:2:3}.jpg ]] && echo mv "$line" "path/${line:2:3}.jpg/"; done. Dicho esto, obviamente, si el directorio no existe, no moverá el archivo. El motivo de la sugerencia es cada vez que uso un comodín, como en, por ejemplo, '*png'en el findcomando, me gusta hacer código posterior que actuará sobre los resultados de un comodín findcondicional.
Menciono esto porque, como ejemplo, si uno accidentalmente (o intencionalmente) dejara la barra inclinada final para "path/${line:2:3}.jpg/"que fuera "path/${line:2:3}.jpg", cambiaría el nombre de un archivo moviéndolo ${line:2:3}.jpgcomo un archivo que no está en un directorio porque el directorio no existe .