web-dev-qa-db-ja.com

sed:読み取れません:そのようなファイルまたはディレクトリはありません

一時フォルダーでアーカイブを解凍した後、フォルダー内のすべてのファイルの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)
7
JohnDow

ああ、あなたは世界で最もひどいものの犠牲者です。シェルスクリプトのスニペットを見つけるためにインターネットを調べたところ、それらの多くが見つかりましたが、それらのほとんどが完全に壊れているとは決して言われていませんでした。スペースを含むファイル名に遭遇すると、それらのほとんどが壊れます。

これは通常、人間が読める情報を出力するように指定されたコマンドの出力を解析するすべてのスクリプトの場合です(例:findまたはls)。

あなたの場合、スペースが含まれていてコマンドを壊すファイル/tmp/tmp.Q18p8BRYcc/Steam engine.txtがあります。

find適切に-execスイッチとともに使用することを検討してください:

find "$tmp" -type f -exec sed -i "s/${targetsubstring}/${newsubstring}/g" {} \;

この場合、findはパーツを-executeします

sed -i "s/${targetsubstring}/${newsubstring}/g" {}

プレースホルダー{}は、見つかったファイル名に置き換えられますが、ファイル名にスペース、改行、その他の面白い記号が含まれている場合は、改行できないように適切に置き換えられます。まあ、{}がハイフンで始まるものに置き換えられた場合、壊れる可能性があります(ただし、変数$tmpがそのようなものに展開されない限り、そうなることはほとんどありません)。この場合、

sed -i "s/${targetsubstring}/${newsubstring}/g" -- {}

もちろん、あなたのsedバージョンが--オプションをサポートしているなら、そうします。

末尾の\;(つまり実行するコマンドの引数の終わり)を+で置き換えると、sedが同じ数の引数で起動されます処理できるため、ファイルごとに1回生成されません。


ただし、find-print0オプションとxargs-0オプションを使用して、findxargsを安全に使用する別の方法があります。 ] _:

find "$tmp" -type f -print0 | xargs -0 sed -i "s/${targetsubstring}/${newsubstring}/g"
17
gniourf_gniourf