(2 respuestas)
Cerrado hace 11 meses.
Parece que "find", "bash" y "sed" en algunos casos no funcionan como uno espera.
El siguiente ejemplo debe crear primero el archivo 'sample.txt', luego encontrar el archivo y finalmente procesarlo con el comando '-exec'. El comando ejecutado imprime el nombre de archivo encontrado, las muestras de prueba y el nombre de archivo modificado. El comando 'sed' en sí mismo se usa para reemplazar 'txt' a 'TXT'.
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") ;
El resultado esperado es:
./muestra.txt Muestra_antes.TXT ./muestra.TXT Muestra_después.TXT
En su lugar, produce:
./muestra.txt Muestra_antes.TXT ./muestra.txt Muestra_después.TXT
(el ejemplo ha sido probado también con la sustitución de comandos de la vieja escuela a través de comillas inversas '`' con el mismo resultado)
¿Qué estoy haciendo mal?
Respuesta aceptada:
La sustitución del comando se ejecuta antes de find
incluso comienza. El comando real ejecutado (después de sustituciones, expansiones y eliminaciones de cotizaciones, etc.) es
find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;
Si necesita ejecutar cualquier cosa fantasía (tuberías o comandos múltiples) con -exec
, luego inicie un shell separado para hacerlo:
find . -maxdepth 1 -type f -name '*.txt'
-exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'