obtener los primeros caracteres del parámetro de expansión del comando find

1

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

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

Todos esos archivos que me gustaría ordenar ahora están 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í

sanjihan
fuente
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?
user3439894
Al principio estaba trabajando con jpg's, pero luego cambié a pngs. No se molestó en cambiar el nombre
sanjihan 01 de

Respuestas:

3

Asumiendo que todos sus archivos están en el mismo directorio y los nombres de los archivos son razonables, 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 como está escrito (incluido el echo) para verificar si el resultado tiene sentido. Luego quite el echoy vuelva a ejecutar.

nohillside
fuente
Mientras me up-voto la respuesta, sin embargo, me gustaría añadir una condición en la forma de poner a prueba el directorio existe, por ejemplo, [[ -d path/${line:2:3}.jpg ]]y lo uso 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 que cada vez que utilizo un comodín, como en, por ejemplo, '*png'en el findcomando, me gusta hacer un código posterior que actúe sobre los resultados de un comodín findcondicional.
user3439894
Menciono esto porque, por ejemplo, si uno accidentalmente (o intencionalmente) deja la barra diagonal desactivada "path/${line:2:3}.jpg/"para que sea "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 existía .
user3439894