
Tengo un comando que lee un archivo y genera una versión modificada en stdout
:
./convert /path/to/file
¿Cómo puedo aplicar recursivamente este comando a todos los archivos en un directorio ysobrescriba el contenido existente de cada archivo con el resultado del comando anterior?
encontréesta preguntaque es muy similar, pero todas las soluciones ofrecidas implican enviar los resultados a un solo archivo, que no es lo que quiero.
Respuesta1
Si entiendo correctamente, puedes convertir un archivo con
./convert /path/to/file >/path/to/file.new
mv /path/to/file.new /path/to/file
Para aplicar un comando a cada archivo en un árbol de directorios, use elfind
utilidad. Dado que necesita ejecutar un comando complejo para cada archivo, debe invocar un shell explícitamente.
find /path/to/top/directory -type f -exec sh -c '
/path/to/convert "$0" >"$0.new" &&
mv "$0.new" "$0"
' {} \;
Respuesta2
La pregunta a la que se vinculó no funciona de forma recursiva, funciona solo en un nivel de profundidad. Para recursividad, utilice find
:
find . -type f -exec /path/to/convert {} \;
Quieres convert
salir del árbol por el que estás caminando por el riesgo de que intente modificarse.
Respuesta3
Si entiendo correctamente, desea sobrescribir cada archivo de entrada con el resultado de convert
ese archivo de entrada. Si es así, prueba esto:
find . -type f | while IFS= read -r file; do
./convert "$file" > /tmp/foo.tmp && mv /tmp/foo.tmp "$file";
done
Respuesta4
Tomando prestado del excelenterespuesta:
find /path/to/top/directory -type f -exec sh -c '/path/to/convert "$0" | tee "$0"' {} \;
Probé lo anterior con sed
, funcionó.