gpt4 book ai didi

linux - 如何使用find和exec执行多条命令

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:00 26 4
gpt4 key购买 nike

我有这样的需求:
video目录下,我需要

find ./video -type f | while read myfile; do
tmp=`basename $myfile` #example.mp4
tmp="${tmp/.mp4/.html}" #example.html
cp index.html "$tmp"
sed -i '' "s#sceneFilePath:.*#sceneFilePath: \"$myfile\",#g" $tmp
#done;

这是我的目录:

dir
|--- video
| |--- example.mp4
|--- index.html
|--- generateHtml.sh

generateHtml.sh 和上面一样。
这是它的作用:
video中找到example.mp4文件,然后cp index.html example.html,在example.html中修改一个字符串.

效果很好。

但是现在对于一些.mp4文件的路径和名称,有一些特殊的字符,比如&, , -while read 似乎不适用于这些情况。

我听说 find -exec 可以处理所有特殊字符,但我不知道如何在这种情况下使用它。

最佳答案

参见 Using Find进行详细讨论。

find ./video -type f -print0 | while IFS= read -r -d '' myfile; do
tmp=$(basename "$myfile") #example.mp4 -- consider also tmp=${myfile##*/}
tmp="${tmp%.mp4}.html" #example.html
sed "s#sceneFilePath:.*#sceneFilePath: \"$myfile\",#g" \
<index.html >"$tmp"
done

注意:

  • -print0用在find端,IFS=read -r -d ''用在端阅读结束;这确保支持所有可能的文件名(包括带有换行符的名称,包括带有前导或尾随空格的名称)。
  • 之前的替换,将文件名中任意位置 .mp4第一个 实例替换为 .html,现已替换为从文件名的末尾去除 .mp4,并附加 .html
  • "$myfile" 在调用 basename 时被引用。这是原始代码中最严重的直接错误,因为以前可以将文件名拆分为多个单独的参数以传递给 basename
  • $() 用于代替反引号。这种现代(是的,符合 POSIX)命令替换语法可以轻松嵌套,并且在反斜杠转义方面具有更清晰的语义。
  • sed -i,它是非标准的和不可移植的(上面对 MacOS 有效但对 GNU 无效),这里不需要;可以跳过 cp 并在线进行转换。

关于linux - 如何使用find和exec执行多条命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43873872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com