cambiar el nombre de los directorios que contienen cuadrados izquierdo/derecho

cambiar el nombre de los directorios que contienen cuadrados izquierdo/derecho

Para cambiar el nombre de directorios que contienen cuadrados izquierdo y derecho, puede utilizar:

shopt -s globstar 
rename -n 's/\(|\[|\]|\)//g' **

Esto cambiará el nombre de todo con [&] del directorio en el que se encuentra y de forma recursiva.

pero necesito ejecutar esto como un script nemo.action y no puedo hacerlo funcionar. (Básicamente un script bash normal)

Mi guión actual es:

#!/bin/bash
shopt -s globstar 

rename  "$@" 's/\(|\[|\]|\)//g' **

dónde $@es/media/sf_Mediaserver3/Untitled Folder/[ hdjue] [kskk]

donde el[ hdjue] [kskk] (solo letras al azar)es la carpeta inicial a la que quiero cambiarle el nombre y los siguientes archivos/carpetas...

Por supuesto, esto no funciona, y ahora tengo que ir al directorio principal y ejecutar las primeras líneas, pero eso procesaría TODOS los directorios en el directorio principal, no solo ¿ [ hdjue] [kskk] Alguien tiene alguna idea de cómo resolver esto?

¿Casi parece que la función de cambio de nombre no puede manejar un directorio de inicio?

Y si es posible, elimine todos los espacios (reemplácelos con . (punto)) y ponga el nombre del archivo/directorio en minúsculas para simplificar la compatibilidad con solicitudes externas/internas.

Respuesta1

El requisito aquí, según tengo entendido, es eliminar todas las instancias de los caracteres [y ]de los archivos y directorios en las rutas especificadas y bajo ellas.

La dificultad es evitar cambiar el nombre del directorio mientras aún se está recorriendo. El globstar **enumera los elementos desde la raíz hacia abajo en lugar de la profundidad primero, por lo que, dado un ejemplo como a a/b a/b/c, cambiar el nombre asignificará que las rutas hacia a/by a/b/cya no son válidas. La findopción puede manejar esto con su -depth, pero eso requiere un enfoque diferente

#!/bin/bash
#
find "$@" -depth -name '*[[\]]*' -print0 |
    while IFS= read -d '' -r item
    do
        path="${item%/*}" file="${item##*/}"    # Separate path and file name parts
        name="${file//[[\]]/}"                  # Generate new file name
        name="${name// /.}"                     # Comment: space becomes dot
        name="${name,,}"                        # Comment: lowercase name

        echo mv -f "$item" "$path/$name"        # Rename
    done

Elimínelo echo(o complételo) cuando esté satisfecho de que el script hará lo que espera.

Lo he usado -print0junto con la -d ''opción para readmanejar archivos con nombres de archivo realmente extraños (incluidos aquellos con nuevas líneas y caracteres que no se imprimen). Puede eliminar ambos si desea ver qué está pasando, o si sus implementaciones no los admiten, pero el script se vuelve menos sólido.

Los modificadores al asignar las variables path, filey namecoinciden usando globos (no expresiones regulares). Un modificador único ( %, #, /) significa una coincidencia única o más corta; un modificador doble ( %%, ##, //) significa una coincidencia más larga o varias coincidencias. Todo está documentado en la bashpágina de manual pero aquí está mi explicación con contexto:

  • ${item%/*}El %indica que elmás cortocoincidencia con el patrón global debe eliminarse delfindel valor de $item. Entonces a/b/celiminaríamos la coincidencia de texto /*dejandoa/b
  • ${item##*/}El ##indica que elmás largocoincidencia con el patrón global debe eliminarse delcomienzodel valor de $item. Entonces a/b/celiminaríamos la coincidencia de texto */dejandoc
  • ${file//[[\]]/}El //indica quemúltipleLos reemplazos del globo deben reemplazarse con el texto que sigue al siguiente /, es decir, nada. El globo es una colección entre corchetes de los dos caracteres [y ], que significa "cualquiera [o ]". Entonces ab[cd]ef[ghterminaríamos conabcdefgh

información relacionada