
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 a
significará que las rutas hacia a/b
y a/b/c
ya no son válidas. La find
opció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 -print0
junto con la -d ''
opción para read
manejar 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
, file
y name
coinciden 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 bash
pá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
. Entoncesa/b/c
eliminarí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
. Entoncesa/b/c
eliminarí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]
". Entoncesab[cd]ef[gh
terminaríamos conabcdefgh