在临时文件夹中解压存档后,我将其用作文件夹中每个文件的 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 脚本的片段,你找到了很多,但你从未被告知其中大多数都是完全损坏的。如果遇到带有空格的文件名,它们中的大多数都会损坏。
所有脚本通常都是这种情况,这些脚本解析指定命令的输出,以输出人类可读的信息,例如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
就会带着尽可能多的参数来启动,所以它不会每个文件生成一次。
然而,还有另一种find
安全使用的方法xargs
,即使用-print0
选项find
和-0
选项xargs
:
find "$tmp" -type f -print0 | xargs -0 sed -i "s/${targetsubstring}/${newsubstring}/g"