Bash Variación de variables en resultados de búsqueda a través de ejecutivos
find exec (1)
¿Hay alguna forma de aplicar la sustitución de variable bash
en la salida de find
? Sé que he visto a alguien hacerlo en desbordamiento de pila, pero parece que ya no puedo encontrar esa publicación en particular.
Como ejemplo , digamos que quiero cambiar el nombre de los archivos *.png
a *_copy.png
. Sé que puedo hacer esto con el rename
pero es solo un experimento mental.
Ahora me gustaría poder hacer algo como esto:
find . -name "*png" -exec mv "{}" "${{}%.*}_copy.png" /;
Lo que resulta en una sustitución inválida . Por supuesto, primero podría asignar el resultado a una variable y luego aplicar la sustitución en un subcuadro, pero ¿ es esta la única manera?
find . -name "*.png" -exec bash -c ''var="{}"; mv "{}" "${var%.*}_copy.png"'' /;
¿O hay alguna manera de que esto se pueda lograr directamente desde {}
?
Consenso
Como observó Etan Reisner , una forma mejor y más segura de manejar la salida del hallazgo sería pasarla como argumento posicional.
find . -name "*.png" -exec bash -c ''mv "$0" "${0%.*}_copy.png"'' "{}" /;
Me tomó un tiempo para obtener la pregunta. Básicamente, preguntas algo como:
echo "${test.png%.png}"
podría usarse para obtener la palabra test
.
La respuesta es no. Los operadores de manipulación de cadenas que comienzan con ${
son un subconjunto de los operadores de sustitución de parámetros . Solo funcionan con variables, no con literales de cadena, lo que significa que debe almacenar la cadena en una variable anterior. Me gusta esto:
img="test.png"
echo "${img%.png}"
Solo para los viajeros de Google, usaría el rename
de rename
para esta tarea en particular. (Como el OP ya mencionado en su pregunta). El comando podría verse así:
find -name ''*png'' -execdir rename ''s//.png/_copy.png/'' {} +