Mi estructura de directorios es la siguiente

Directory1\file1.jpg
          \file2.jpg
          \file3.jpg

Directory2\anotherfile1.jpg
          \anotherfile2.jpg
          \anotherfile3.jpg

Directory3\yetanotherfile1.jpg
          \yetanotherfile2.jpg
          \yetanotherfile3.jpg

Estoy tratando de utilizar la línea de comando en un shell de bash en ubuntu para tomar el primer archivo de cada carpeta y cambiarle el nombre a nombre del directorio y subir un nivel, así que se sienta junto a el directorio.

En el ejemplo anterior:

  • file1.jpg sería cambiar el nombre a Directory1.jpg y se coloca junto a la carpeta Directory1
  • anotherfile1.jpg sería cambiar el nombre a Directory2.jpg y se coloca junto a la carpeta Directory2
  • yetanotherfile1.jpg sería cambiar el nombre a Directory3.jpg y se coloca junto a la carpeta Directory3

He intentado usar:

find . -name "*.jpg"

pero no muestra los archivos en orden secuencial (me falta el primer archivo).

Esta línea:

find . -name "*.jpg" -type f -exec ls "{}" +;

listas de los archivos en el orden correcto, pero ¿cómo puedo elegir solo el primer archivo de cada directorio y subir un nivel?

Cualquier ayuda se agradece!

Edit: Cuando me refiero a que el primer archivo lo que quiero decir es que cada uno de los jpg se numeran de 0 a sin embargo, muchos de los archivos en esa carpeta, por ejemplo: archivo1, archivo2…… file34, file35 etc… Otra cosa a mencionar es el formato de los archivos es aleatorio, por lo que la numeración podría empezar en 0 o 1a o 1b, etc…

Definir la «primera».
Ampliación de Ignacio del comentario, es importante saber lo que significa «primero». La primera por orden alfabético? Si es así y si el número de 2 dígitos, desea ordenar file3.jpg por delante de file10.jpg en lugar de la lista alfabética de manera que file10.jpg tendría que venir primero? Si usted no desea alfabéticamente, ¿quiere usted el primero en el orden de la forma en que se almacena en el disco? Por fecha? Y así sucesivamente.

OriginalEl autor user2008746 | 2013-01-24

3 Comentarios

  1. 23

    Si primera significa que cualquiera que sea el shell glob busca en primer lugar (léxico, pero probablemente afectados por LC_COLLATE), entonces esto debería funcionar:

    for dir in */; do
        for file in "$dir"*.jpg; do
            echo mv "$file" "${file%/*}.jpg" # If it does what you want, remove the echo
            break 1
        done
    done

    Prueba de concepto:

    $ mkdir dir{1,2,3} && touch dir{1,2,3}/file{1,2,3}.jpg
    $ for dir in */; do for file in "$dir"*.jpg; do echo mv "$file" "${file%/*}.jpg"; break 1; done; done
    mv dir1/file1.jpg dir1.jpg
    mv dir2/file1.jpg dir2.jpg
    mv dir3/file1.jpg dir3.jpg
    Esto es exactamente lo que necesito, gracias!

    OriginalEl autor kojiro

  2. 18

    Usted puede ir dentro de cada uno de los directorios y ejecutar:

    $ mv `ls | head -n 1` ..
    simple y Unixy, me gusta
    es una mala idea a la tubería de ls como que
    Hola @LưuVĩnhPhúc, gracias por el enlace. El artículo hace un buen punto. En mi caso, sin embargo, los nombres de los archivos fueron todos los auto-generado y después de un muy específicas formato predefinido. De modo que el borde de los casos, el artículo advierte acerca de la realidad no aplican. En general los casos, sí, probablemente no es una buena idea. Gracias!

    OriginalEl autor mirandes

  3. 1

    Buscar todo el primer nivel de directorios, identificar primero el archivo en este directorio y, a continuación, mueva esto a un nivel de hasta

    find . -type d \! -name . -prune | while read d; do
        f=$(ls $d | head -1)
        mv $d/$f .
    done

    OriginalEl autor Olaf Dietsche

Dejar respuesta

Please enter your comment!
Please enter your name here