一時フォルダーでアーカイブを解凍した後、フォルダー内のすべてのファイルのstr_replaceとしてこれを使用します
find "$tmp" -type f | xargs sed -i "s/${targetsubstring}/${newsubstring}/g"
しかし、私はこのエラーを受け取ります:
sed: can't read /tmp/tmp.Q18p8BRYcc/Steam: No such file or directory
sed: can't read engine.txt: No such file or directory
私の一時変数:
tmp =
mktemp -d
何が悪いのですか?
[〜#〜]更新[〜#〜]
archive=`readlink -e $1` #First param is tar archive without file structure (only text files inside)
targetsubstring=$2 #Substring to replace
newsubstring=$3 #Substring to replaced by
tmp=`mktemp -d` #Create a room to unzip our archive
if [ -f "$archive" ]; #Check if archive exist
then
echo "Well done! (And yeah, I know about [ ! -f '$1' ], but where would be the fun?)" >/dev/null
else
echo "File doesn't exist! Terminating program." >&2
exit 1
fi
tar xvf "$archive" -C "$tmp" >/dev/null #Unzip archive to temp folder
find "$tmp" -type f | xargs sed -i "s/${targetsubstring}/${newsubstring}/g" #For every file do str_replace (There is a problem somwhere)
cd "$tmp"
tar -zcf "$archive" . #Zip this to original file (I don't want any folder in my tar file)
ああ、あなたは世界で最もひどいものの犠牲者です。シェルスクリプトのスニペットを見つけるためにインターネットを調べたところ、それらの多くが見つかりましたが、それらのほとんどが完全に壊れているとは決して言われていませんでした。スペースを含むファイル名に遭遇すると、それらのほとんどが壊れます。
これは通常、人間が読める情報を出力するように指定されたコマンドの出力を解析するすべてのスクリプトの場合です(例:find
またはls
)。
あなたの場合、スペースが含まれていてコマンドを壊すファイル/tmp/tmp.Q18p8BRYcc/Steam engine.txt
があります。
find
適切にを-exec
スイッチとともに使用することを検討してください:
find "$tmp" -type f -exec sed -i "s/${targetsubstring}/${newsubstring}/g" {} \;
この場合、find
はパーツを-exec
uteします
sed -i "s/${targetsubstring}/${newsubstring}/g" {}
プレースホルダー{}
は、見つかったファイル名に置き換えられますが、ファイル名にスペース、改行、その他の面白い記号が含まれている場合は、改行できないように適切に置き換えられます。まあ、{}
がハイフンで始まるものに置き換えられた場合、壊れる可能性があります(ただし、変数$tmp
がそのようなものに展開されない限り、そうなることはほとんどありません)。この場合、
sed -i "s/${targetsubstring}/${newsubstring}/g" -- {}
もちろん、あなたのsed
バージョンが--
オプションをサポートしているなら、そうします。
末尾の\;
(つまり実行するコマンドの引数の終わり)を+
で置き換えると、sed
が同じ数の引数で起動されます処理できるため、ファイルごとに1回生成されません。
ただし、find
の-print0
オプションとxargs
の-0
オプションを使用して、find
でxargs
を安全に使用する別の方法があります。 ] _:
find "$tmp" -type f -print0 | xargs -0 sed -i "s/${targetsubstring}/${newsubstring}/g"