Estou tentando lidar com a seguinte situação. Tenho muitos arquivos (mais de 100) com .html
extensão em uma árvore de pastas e dentro desses arquivos tenho uma string que é o nome do arquivo. Por exemplo tenho os seguintes arquivos:
file1.html
localizado em subfolder1/subfolderA/
algum lugar do arquivo que contém a string file1.html
.
file2.html
localizado em subfolder1/subfolderB/
algum lugar do arquivo que contém a stringfile2.html
file3.html
localizado em subfolder2/subfolderC/
algum lugar do arquivo que contém a string file3.html
.
e assim por diante.
Basicamente, quero percorrer toda a estrutura em árvore, encontrar a string que é idêntica ao nome do arquivo e substituí-la pelo caminho + nome do arquivo, removendo a extensão .html
.
Portanto, no exemplo acima, quero substituir:
no arquivo
file1.html
:substituir
file1.html
comsubfolder1/subfolderA/file1
em
file2.html
:substituir
file2.html
comsubfolder1/subfolderB/file2
no arquivo3.html:
substituir
file3.html
comsubfolder2/subfolderC/file3
Eu sei como substituir strings usando find
e sed
. Usei o seguinte comando:
find . -type f -name \*.html -exec sed -i.bak 's|<old string>|<new string>|g' {} +
No entanto, nesse caso, "string antiga" e "nova string" precisam ser codificadas.
Como posso conseguir o que foi dito acima com
"string antiga" = nome do arquivo + extensão do arquivo
"nova string" = caminho + nome do arquivo - extensão do arquivo
Qualquer ajuda será muito apreciada.
Responder1
Receio que você não possa fazer o que especifica find
sozinho exec
. Experimente find
o resultado de piping em um pequeno while
loop:
find . -type f -name \*.html | while read PN; do sed "s|${PN##*/}|${PN%.*}|g" "$PN"; done
Responder2
Testado e funcionou bem
#!/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