Tengo algo como esto:

v_1/file.txt
v_2/file.txt
v_3/file.txt
...

y quiero cambiar el nombre de los archivos a algo como esto:

v_1.txt
v_2.txt
v_3.txt
...

en el mismo directorio.

Supongo que puedo usar rename pero no puedo averiguar cómo usarlo con carpeta y renombrar archivos al mismo tiempo.

Desbordamiento de pila no es un código de escritura de servicio. Por favor, mostrar su código. Desde Desbordamiento de Pila oculta el Cierre razón de que: Preguntas en busca de depuración de ayuda («¿por qué no esta el código de trabajo?») debe incluir el comportamiento deseado, de un problema específico o de error y el menor código necesario para reproducir en la propia pregunta. Preguntas sin una clara declaración del problema no son útiles para otros lectores. Ver: Cómo crear un Mínimo, Completa y Verificable ejemplo.

OriginalEl autor giskou | 2013-01-13

3 Comentarios

  1. 21

    El resultado puede ser alcanzado con un golpe de bucle y mv:

    for subdir in *; do mv $subdir/file.txt $subdir.txt; done;
    

    Tenga en cuenta que la solución anterior no funciona si el nombre del directorio que contiene espacios. Relacionados con enlace.

    Otra solución basada en los comentarios (que funciona para directorios tener espacios en el nombre):

    find . -type d -not -empty -exec echo mv \{\}/file.txt \{\}.txt \;
    
    parece lo suficientemente bueno
    $subdir debe ser "$subdir" y eliminar las carpetas vacías find . -type d -empty -exec rm -rf \{\} \;
    Si te gusta escribir. Una sola s#/file## cambiar el nombre es mucho más fácil escribir, y está a la derecha y nivel de abstracción. La repetición de la misma shell bucle de toda su vida para cambiar el nombre de archivos envejece rápido.
    No veo por qué las carpetas vacías problema porque el mv simplemente fracasará. También, la eliminación de un vacío dir con rm -rf es una exageración, usted puede simplemente utilizar rmdir, es más seguro.
    tener que encontrar comando anterior puede también ser modificado para hacer la tarea: find . -type d -not -empty -exec echo mv \"\{\}/file.txt\" \"\{\}.txt\" \;

    OriginalEl autor Csq

  2. 1

    Puede utilizar rnm. El comando sería:

    rnm -fo -dp -1 -ns '/pd0/.txt' -ss '\.txt$' /path/to/the/directory
    

    -fo implica archivo en modo de sólo.

    -dp directorio de profundidad. -1 hace recursiva para todos los subdirectorios.

    -ns implica cadena de nombre de yo.e el nuevo nombre del archivo.

    /pd0/ es la inmediata de los padres de directorio del archivo que está sujeto a la operación de cambio de nombre.

    -ss es una cadena de búsqueda (regex). '\.txt$' regex busca el archivo con .txt al final del nombre de archivo.

    /path/to/the/directory este es el camino donde el v_1, v_2 … directorios residen. Usted puede pasar los directorios ( v_1, v_2 …) en lugar de los padres y la ruta del directorio. Por ejemplo:

    #from inside the parent directory
    rnm -fo -dp -1  -ns '/pd0/.txt' -ss '\.txt$' v_* 
    

    OriginalEl autor Jahid

  3. 0

    Parece bastante sencillo para mí:

    $ mkdir /tmp/sandbox
    $ cd /tmp/sandbox
    
    $ mkdir v_{1,2,3}
    $ touch v_{1,2,3}/file.txt
    
    $ rename -v 's#/file##' v_{1,2,3}/file.txt
    rename v_1/file.txt v_1.txt
    rename v_2/file.txt v_2.txt
    rename v_3/file.txt v_3.txt
    
    $ ls -F
    v_1/ v_1.txt    v_2/ v_2.txt    v_3/ v_3.txt
    
    las subcarpetas son cerca de 130 y no sólo el 3 😛
    No entiendo por qué es importante: yo era, simplemente, lo que demuestra que la técnica funciona. El número de subdirectorios es irrelevante, a menos que usted golpea xargs límites, e incluso que es trivial ya que el Perl rename va a leer los nombres de archivo en la entrada estándar.
    Yo soy más de bash que perl y regex. Si pudiera explicar su técnica en detalle… yo realmente no sé lo que hace 😛
    Simplemente aplicar un estándar search&comando reemplazar como se utiliza en cualquier editor, por lo que s/foo/bar/g cambios en todas las instancias de foo en los nombres de archivo en las instancias de bar, etc.

    OriginalEl autor tchrist

Dejar respuesta

Please enter your comment!
Please enter your name here