我正在尝试递归地查找与模式 *.xml 匹配的所有文件并删除其中的一些代码。
这是我想出的:
- 查找所有 .xml 文件并删除行
- 从第一次出现
def=something
开始到第一次出现</box>
find config/view -type f -name "*.xml" -exec sed -n '/def=something/,/<\/box>/!p' > tmp.xml {} \; -exec mv tmp.xml {} \;
它适用于目录中的 1 个文件,但它给出:
mv: cannot access tmp.xml
当我在包含许多文件的目录上调用它时
我的脚本中的错误在哪里?或者也许有更好/更简单的方法来做到这一点?
最佳答案
错误在于,在 find
的 -exec sed
语句中,您没有执行:
sed -n '/def=something/,/</box>/!p' > tmp.xml {}
(带有重定向)。
事实上,你的行相当于:
find config/view -type f -name "*.xml" -exec sed -n '/def=something/,/<\/box>/!p' {} \; -exec mv tmp.xml {} \; > tmp.xml
也就是说,find
的所有输出都被重定向到文件tmp.xml
。然后,在找到第一个文件后,tmp.xml 不再存在(因为它已被移动),一切都搞砸了!
要解决这个问题,您可以使用内联编辑,如 fedorqui 的答案所示:
find config/view -type f -name "*.xml" -exec sed -i -n '/def=something/,/<\/box>/!p' {} +
(注意行尾的 +
),或者您可以:
find config/view -type f -name "*.xml" -exec bash -c 'sed -n "/def=something/,/<\/box>/!p" "$0" > tmp.xml; mv tmp.xml "$0"' {} \;
但这并不那么好。不过,如果您的 sed
不支持 -i
标志(GNU sed
支持),它很有用。
关于xml - 在控制台中删除 .xml 文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17451208/