sed:无法读取:没有这样的文件或目录

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 变量:

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)

答案1

哦,亲爱的,你是世界上最可怕的事情的受害者:你在互联网上寻找 shell 脚本的片段,你找到了很多,但你从未被告知其中大多数都是完全损坏的。如果遇到带有空格的文件名,它们中的大多数都会损坏。

所有脚本通常都是这种情况,这些脚本解析指定命令的输出,以输出人类可读的信息,例如findls

就您而言,您的文件/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就会带着尽可能多的参数来启动,所以它不会每个文件生成一次。


然而,还有另一种find安全使用的方法xargs,即使用-print0选项find-0选项xargs

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

相关内容