Estoy tratando de lidiar con la siguiente situación. Tengo muchos archivos (más de 100) con una .html
extensión en un árbol de carpetas y dentro de esos archivos tengo una cadena que es el nombre del archivo. Por ejemplo tengo los siguientes archivos:
file1.html
ubicado en subfolder1/subfolderA/
el que en algún lugar del archivo contiene la cadena file1.html
.
file2.html
ubicado en subfolder1/subfolderB/
el que en algún lugar del archivo contiene la cadenafile2.html
file3.html
ubicado en subfolder2/subfolderC/
el que en algún lugar del archivo contiene la cadena file3.html
.
etcétera.
Básicamente, quiero recorrer toda la estructura del árbol, encontrar la cadena que sea idéntica al nombre del archivo y reemplazarla con la ruta + nombre del archivo, eliminando el archivo .html
.
Por lo tanto, en el ejemplo anterior, quiero reemplazar:
en archivo
file1.html
:reemplazar
file1.html
consubfolder1/subfolderA/file1
en
file2.html
:reemplazar
file2.html
consubfolder1/subfolderB/file2
en archivo3.html:
reemplazar
file3.html
consubfolder2/subfolderC/file3
Sé cómo reemplazar cadenas usando find
y sed
. Usé el siguiente comando:
find . -type f -name \*.html -exec sed -i.bak 's|<old string>|<new string>|g' {} +
Sin embargo, en ese caso, la "cadena antigua" y la "cadena nueva" deben estar codificadas.
¿Cómo puedo lograr lo anterior con
"cadena antigua" = el nombre del archivo + extensión del archivo
"nueva cadena" = la ruta + nombre del archivo - extensión del archivo
Cualquier ayuda será apreciada.
Respuesta1
Me temo que no puedes hacer lo que especificas con find
y exec
solo. Intente canalizar find
el resultado en un pequeño while
bucle:
find . -type f -name \*.html | while read PN; do sed "s|${PN##*/}|${PN%.*}|g" "$PN"; done
Respuesta2
Probado y funcionó bien
#!/bin/bash
echo "enter the input"
read p
cd $p
echo "enter the file"
read f
if [[ -f $p/$f ]]
then
echo "file exsists"
grep -io "$f" $p/$f >/dev/null
if [[ $? == 0 ]]
then
r=`echo $f | sed "s/\.txt//g"`
echo $r
awk -v f="$f" -v r="$r" '{gsub(f,r,$0);print }' $f
fi
fi