1 votos

Comando de terminal para mover todos los archivos sueltos a un directorio con el nombre de archivo

Tengo una carpeta que contiene miles de archivos y directorios. Me gustaría mover todos los archivos que no están contenidos en un subdirectorio a un directorio y nombrarlo con el nombre del archivo, mientras que dejar los archivos ya dentro de los directorios solo, es decir:

  • crear 'newdir'
  • mover 123.mp4 a 'newdir'
  • cambiar el nombre 'newdir' por '123'
  • Repita

0 votos

1voto

David Anderson Puntos 2189

Comando

Este comando fue probado en un shell bash.

for x in *;do if [[ -f $x ]];then mkdir newdir;mv "$x" newdir/.;mv newdir "${x%.*}";fi;done

Explicación

El código que se muestra a continuación no son comandos necesarios que pueda ejecutar. Más bien, lo que se muestra es una explicación de varias partes del código mostrado arriba.

Recorre todos los nombres de archivos del directorio actual.

for x in *;do ... done

Sólo hace archivos regulares. (Omita los directorios).

if [[ -f $x ]];then ... fi;

Hacer un nuevo directorio newdir .

mkdir "newdir";

Mover archivo x al nuevo directorio newdir .

mv "$x" newdir/.;

Cambiar el nombre de newdir al nombre del nuevo directorio deseado. (Establezca newdir al nombre del archivo x después de eliminar el último . y todos los personajes que le siguen).

mv newdir "${x%.*}";

Comentarios

Si el directorio deseado ya existe, entonces el newdir (que contiene el archivo) se moverá al directorio deseado. Por ejemplo, si el archivo 123.mp4 y el directorio 123 ambos ya existen, entonces el archivo 123.mp4 terminará en 123/newdir . Puede comprobar si esto ha ocurrido introduciendo el comando que se indica a continuación.

find . -name newdir

Por ejemplo, si 123/newdir/123.mp4 existía, entonces aparecería la siguiente salida.

./123/newdir

0voto

awy Puntos 500

Limitaciones:

  • No lo hace funciona si tiene cualquier archivo sin extensión. 1

  • Hay que añadir el manejo de excepciones en caso de que un directorio ya exista.

  • Funciona en Mojave. Python 3.7.3, pero los puestos que aparecen a continuación a menudo no mencionan sus versiones tampoco.

  • No publicó en Revisión del código .

  • #%% son para la extensión Jupyter de VSCode.

    %%

    import os

    %%

    source = "/Users/me/Desktop/folder" # notice the missing last "/" filenames = next(os.walk(source))[2] filenames = [ x for x in filenames if not ".DS_Store" in x]

    %%

    dirpaths = [os.path.splitext(file)[0] for file in filenames]

    %%

    def making(directory,source=source): directory = os.path.join(source,directory+"/") os.makedirs(directory)

    a = [making(directory) for directory in dirpaths] #list comprehension could be faster than loops.

    %%

    def movingfiles(onefile, source=source): os.rename(source + "/" + onefile, source + "/" + os.path.splitext(onefile)[0] + "/" + onefile )

    b = [movingfiles(onefile) for onefile in filenames] #useless list again.

Fuentes por orden de necesidad:

0 votos

No tengo mucha soltura con Python, pero probablemente se podría evitar la restricción "No funciona si tienes cualquier archivo sin extensión" añadiendo algo de lógica a la función en la que se llama a os.rename .

0 votos

Además, los nombres de tus funciones no ayudan a que el código sea comprensible.

0 votos

Esa parte está documentada en el último enlace sobre el SO y la limitación viene de la creación de directorios, que acorté la longitud, haciéndolo con el nombre del archivo directamente en lugar de usar un nombre intermedio.

0voto

Si desea utilizar find para evitar los típicos problemas con los nombres de archivo que contienen espacios y otros caracteres de espacio en blanco:

find . -maxdepth 1 -type f ! -name '.DS_Store' -exec bash -c '
    t="${1:2}";
    mkdir FluffyBird;
    mv "$t" FluffyBird/
    mv FluffyBird "${t%.*}"' _ {} \;

Sustituir FluffyBird con cualquier cadena que no sea ya un nombre de archivo en la carpeta.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X