Sed

在 docker 中查找和 sed 字元串出錯設備或資源忙

  • February 3, 2021

這個問題只發生在 docker 容器中。

只有find很好:

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"

find用 sed

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"|xargs sed -i "s/10.142.55.199/host02/g"

給出一個錯誤:

/xxx/config/sed8Ey5tD: Device or resource busy

看不懂是什麼sed8Ey5tDls看不到。我認為它是由碼頭工人,但無法弄清楚。

如何取得sed成功?


好的,我發現該文件正在被 docker 卷, volumes: /xxx/config.json : /xxx/config/config.jsondocker-compose.yml. 之後docker-compose down,就可以編輯文件了。但是如何在沒有 的情況下編輯文件docker-compose down

是的,正如您所發現的,該文件是由 docker 掛載的,這意味著您不允許從 docker 容器中更改其 inode。但是,如果你只更改文件的內容而不觸及它的 inode,它會起作用嗎?當然,確實如此。所以你需要做的就是想辦法只改變原始文件的內容,而不是創建一個新文件然後替換原來的文件。

sed帶有選項的命令-i確實會創建新文件,然後用新文件替換舊文件,這肯定會更改文件 inode。這就是為什麼它會給你錯誤。

那麼,有哪些方法可以改變文件的內容呢?很多很多方法。

  1. 外殼重定向,例如,echo abc > file
  2. 命令cp,例如,cp new old
  3. vim

舉幾個例子來說明如何解決你的問題:

cp方式:

查找 ${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方式_

**貓 > /tmp/vim-temp-script <<EOF
:set nobackup backupcopy=yes
:讓我 = 0
:而 1
: 讓我 += 1
: %s/10.142.55.199/host02/g
: 如果我 >= argc()
: 休息
: 萬一
: w
:結束而
:wq
EOF**
查找 ${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'——**

引用自:https://unix.stackexchange.com/questions/404189