Ich versuche, mit der folgenden Situation umzugehen. Ich habe viele Dateien (mehr als 100) mit einer .html
Erweiterung in einem Ordnerbaum und innerhalb dieser Dateien habe ich eine Zeichenfolge, die der Dateiname ist. Beispielsweise habe ich die folgenden Dateien:
file1.html
befindet sich an subfolder1/subfolderA/
einer Stelle in der Datei, an der sich die Zeichenfolge befindet file1.html
.
file2.html
befindet sich in subfolder1/subfolderB/
der irgendwo in der Datei befindet sich die Zeichenfolgefile2.html
file3.html
befindet sich an subfolder2/subfolderC/
einer Stelle in der Datei, an der sich die Zeichenfolge befindet file3.html
.
und so weiter.
Grundsätzlich möchte ich die gesamte Baumstruktur durchgehen, die Zeichenfolge finden, die mit dem Dateinamen identisch ist, und sie durch den Pfad + Dateinamen ersetzen und dabei die entfernen .html
.
Daher möchte ich im obigen Beispiel Folgendes ersetzen:
im Ordner
file1.html
:ersetzen
file1.html
mitsubfolder1/subfolderA/file1
In
file2.html
:ersetzen
file2.html
mitsubfolder1/subfolderB/file2
in Datei3.html:
ersetzen
file3.html
mitsubfolder2/subfolderC/file3
find
Ich weiß, wie man Zeichenfolgen durch und ersetzt sed
. Ich habe den folgenden Befehl verwendet:
find . -type f -name \*.html -exec sed -i.bak 's|<old string>|<new string>|g' {} +
In diesem Fall müssen jedoch „alter String“ und „neuer String“ fest codiert werden.
Wie kann ich das oben genannte erreichen mit
"alter String" = der Dateiname + Dateierweiterung
"neuer String" = Pfad + Dateiname - Dateierweiterung
Jede Hilfe wird sehr geschätzt.
Antwort1
Ich fürchte, Sie können das, was Sie angeben, nicht allein mit find
und tun exec
. Versuchen Sie, find
das Ergebnis von in eine kleine while
Schleife zu leiten:
find . -type f -name \*.html | while read PN; do sed "s|${PN##*/}|${PN%.*}|g" "$PN"; done
Antwort2
Getestet und funktionierte gut
#!/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