Mit*_*ril 11 sed find xargs docker
这个问题只发生在 docker 容器中。
只有find:
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"
Run Code Online (Sandbox Code Playgroud)
find 与 sed
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"|xargs sed -i "s/10.142.55.199/host02/g"
Run Code Online (Sandbox Code Playgroud)
给出一个错误:
/xxx/config/sed8Ey5tD: Device or resource busy
Run Code Online (Sandbox Code Playgroud)
我不明白是什么sed8Ey5tD,ls看不到它。我认为是 docker 造成的,但无法弄清楚。
如何取得sed成功?
好的,我发现文件正在被 docker 卷, volumes: /xxx/config.json : /xxx/config/config.json 在docker-compose.yml. 之后docker-compose down,就可以编辑文件了。但是我如何在没有 的情况下编辑文件docker-compose down?
Bru*_*uce 12
是的,正如您发现的,该文件是由 docker 挂载的,这意味着您不能从 docker 容器内更改其 inode。但是,如果您只更改文件的内容而不触及其 inode,会怎样呢?当然,确实如此。所以你需要做的就是找到一种方法只改变原始文件的内容,而不是创建一个新文件然后替换原来的文件。
sed带选项的命令-i确实会创建新文件,然后用新文件替换旧文件,这肯定会更改文件 inode。这就是为什么它会给你错误。
那么,有哪些方法可以改变文件的内容呢?许多许多方式。
echo abc > filecp,例如,cp new old给你几个例子来说明如何解决你的问题:
该cp方式:
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json" | xargs -L1 bash -c 'sed "s/10.142.55.199/host02/g" $1 > /tmp/.intermediate-file-2431; cp /tmp/.intermediate-file-2431 $1;' ——
该vim方法
cat > /tmp/vim-temp-script <<EOF
:set nobackup backupcopy=yes
:让我 = 0
:虽然 1
: 让我 += 1
: %s/10.142.55.199/host02/g
: 如果我 >= argc()
: 休息
: 万一
:wn
:endwhile
:wq
EOF
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json" | xargs vim -s /tmp/vim-temp-script
该ed方法
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "* .json "|xargs -L1 bash -c 'ed $1 <<EOF
,s/10.142.55.199/host02/g
wq
EOF'--
sed有一个-c使用 with 的选项-i,以便它进行复制而不是移动,这使得这项工作可行。
这有效:
RUN sed -ci "s/localhost/foobar/g" /etc/hosts
Run Code Online (Sandbox Code Playgroud)
但请仔细注意,这sed -ic不会起作用,因为它会生成以 结尾的备份文件.c,而不是执行“what sed -i -c”或“ sed -cidoes”。
今天通过这次学习清理了一个 docker 脚本:)
| 归档时间: |
|
| 查看次数: |
14247 次 |
| 最近记录: |