bash find exec substitution built-in

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/'' {} +