<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on kngdev.com</title><link>https://kngdev.com/post/</link><description>Recent content in Posts on kngdev.com</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Wed, 16 Apr 2025 15:00:30 +0000</lastBuildDate><atom:link href="https://kngdev.com/post/index.xml" rel="self" type="application/rss+xml"/><item><title>openwrt 小炸还原</title><link>https://kngdev.com/post/2025-04-16_openwrt-%E5%B0%8F%E7%82%B8%E8%BF%98%E5%8E%9F/</link><pubDate>Wed, 16 Apr 2025 15:00:30 +0000</pubDate><guid>https://kngdev.com/post/2025-04-16_openwrt-%E5%B0%8F%E7%82%B8%E8%BF%98%E5%8E%9F/</guid><description>&lt;p&gt;因为在 dnsmasq 里把本地域名后缀从 lan 改为 local，不知怎么转天就炸了&lt;/p&gt;&#10;&lt;p&gt;物理登录后测试 nslookup 无法连接服务器，但是直接 ping 通百度的 IP&lt;/p&gt;&#10;&lt;p&gt;尝试还原&lt;/p&gt;&#10;&lt;p&gt;好在文件系统没什么问题，直接到 /root/localbackup/ 中找到前一天的备份文件&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;tar -xvpzf /root/localbackup/n100wrt-tue.tar.gz -C /&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;用备份覆盖整个文件系统，然后 reboot 重启，搞定&lt;/p&gt;&#10;</description></item><item><title>进一步改善批量重命名脚本</title><link>https://kngdev.com/post/2024-06-28_%E8%BF%9B%E4%B8%80%E6%AD%A5%E6%94%B9%E5%96%84%E6%89%B9%E9%87%8F%E9%87%8D%E5%91%BD%E5%90%8D%E8%84%9A%E6%9C%AC/</link><pubDate>Fri, 28 Jun 2024 08:57:59 +0000</pubDate><guid>https://kngdev.com/post/2024-06-28_%E8%BF%9B%E4%B8%80%E6%AD%A5%E6%94%B9%E5%96%84%E6%89%B9%E9%87%8F%E9%87%8D%E5%91%BD%E5%90%8D%E8%84%9A%E6%9C%AC/</guid><description>&lt;p&gt;今天的下载文件里出现了带有 v2 的情况，于是借着这个机会改善一下批量重命名脚本&lt;/p&gt;&#10;&lt;p&gt;首先是试验场&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;rafom@rfm-main-win:~/playground$ ls&#10;&amp;#39;Some test text 01 [Test 111].txt&amp;#39; &amp;#39;Some test text 05 [Test 111][add. text].test&amp;#39; test&#10;&amp;#39;Some test text 03v2 [Test 111].txt&amp;#39; &amp;#39;Some test text 2 [Test 111].txt&amp;#39;&#10;&amp;#39;Some test text 04 [Test 111][add. text].txt&amp;#39; resource&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;模拟了不需要的文件类型、有附加信息、有v2、集数只有一位的情况&lt;/p&gt;&#10;&lt;p&gt;首先使用扩展正则表达式标记 -re，然后在替换时使用 \1、\3 这类标记来匹配子串，并且不对话数之后的部分进行精确匹配。用先补 0 后删除多余位的方式处理集数只有一位的情况。调整后的命令大概是下面这个样子&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;rafom@rfm-main-win:~/playground$ ls | grep -E &amp;#39;^Some test text [0-9]?[0-9](v[0-9])? .*\\.txt$&amp;#39; | while read line; do echo $line; echo $line | sed -re &amp;#39;s/Some test text ([0-9]?[0-9])(v[0-9])? .*(\\.txt)/S01E0\\1\\3/&amp;#39; -re &amp;#39;s/[0-9]?([0-9][0-9])\\./\\1\\./&amp;#39;; done&#10;Some test text 01 [Test 111].txt&#10;S01E01.txt&#10;Some test text 03v2 [Test 111].txt&#10;S01E03.txt&#10;Some test text 04 [Test 111][add. text].txt&#10;S01E04.txt&#10;Some test text 2 [Test 111].txt&#10;S01E02.txt&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;看起来没问题，那么根据这个去修改实际的脚本，如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash&#10;&#10;ls /volume1/downloads/anime | grep -E &amp;#39;^\\[ANi\\] 蔚藍檔案 The Animation \\- [0-9]?[0-9](v[0-9])? .*\\.mp4$&amp;#39; | while read line; do mv -b /volume1/downloads/anime/&amp;#34;$line&amp;#34; /volume1/media/anime/&amp;#34;蔚蓝档案 动画版&amp;#34;/$(echo $line | sed -re &amp;#39;s/\\[ANi\\] 蔚藍檔案 The Animation \\- ([0-9]?[0-9])(v[0-9])? .*(\\.mp4)/S01E0\\1\\3/&amp;#39; -re &amp;#39;s/[0-9]?([0-9][0-9])\\./\\1\\./&amp;#39;); done&#10;ls /volume1/downloads/anime | grep -E &amp;#39;^\\[Nekomoe kissaten&amp;amp;LoliHouse\\] Shuumatsu Train Doko e Iku \\- [0-9]?[0-9](v[0-9])? .*\\.mkv$&amp;#39; | while read line; do mv -b /volume1/downloads/anime/&amp;#34;$line&amp;#34; /volume1/media/anime/&amp;#34;末日列车去哪里？&amp;#34;/$(echo $line | sed -re &amp;#39;s/\\[Nekomoe kissaten&amp;amp;LoliHouse\\] Shuumatsu Train Doko e Iku \\- ([0-9]?[0-9])(v[0-9])? .*(\\.mkv)/S01E0\\1\\3/&amp;#39; -re &amp;#39;s/[0-9]?([0-9][0-9])\\./\\1\\./&amp;#39;); done&#10;ls /volume1/downloads/anime | grep -E &amp;#39;^\\[ANi\\] 尼爾：自動人形 Ver1\\.1a \\- [0-9]?[0-9](v[0-9])? .*\\.mp4$&amp;#39; | while read line; do mv -b /volume1/downloads/anime/&amp;#34;$line&amp;#34; /volume1/media/anime/&amp;#34;尼尔：自动人形 Ver1.1a&amp;#34;/$(echo $line | sed -re &amp;#39;s/\\[ANi\\] 尼爾：自動人形 Ver1\\.1a \\- ([0-9]?[0-9])(v[0-9])? .*(\\.mp4)/S01E0\\1\\3/&amp;#39; -re &amp;#39;s/[0-9]?([0-9][0-9])\\./\\1\\./&amp;#39;); done&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;执行了下没有问题，收工&lt;/p&gt;&#10;&lt;p&gt;参考资料： &lt;a class="link" href="https://wangchujiang.com/linux-command/c/sed.html" target="_blank" rel="noopener"&#10; &gt;https://wangchujiang.com/linux-command/c/sed.html&lt;/a&gt; （&lt;a class="link" href="https://web.archive.org/web/20240314083038/https://wangchujiang.com/linux-command/c/sed.html" target="_blank" rel="noopener"&#10; &gt;快照&lt;/a&gt;）&lt;/p&gt;&#10;</description></item><item><title>Ubuntu 中启动时自动挂载 SMB 共享</title><link>https://kngdev.com/post/2024-06-26_ubuntu-%E4%B8%AD%E5%90%AF%E5%8A%A8%E6%97%B6%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BD-smb-%E5%85%B1%E4%BA%AB/</link><pubDate>Wed, 26 Jun 2024 07:04:07 +0000</pubDate><guid>https://kngdev.com/post/2024-06-26_ubuntu-%E4%B8%AD%E5%90%AF%E5%8A%A8%E6%97%B6%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BD-smb-%E5%85%B1%E4%BA%AB/</guid><description>&lt;p&gt;我的 KeePass 密码库文件是保存在家庭网络里的，为了让 KeePass 在每次启动电脑后都能自动载入密码库，我需要让 Ubuntu 在启动时自动挂载 SMB 目录&lt;/p&gt;&#10;&lt;p&gt;首先是创建本地挂载点 mkdir /mnt/&amp;lt;local_dir&amp;gt;。这里需要注意的是，服务器端不可以挂载整个服务器，所以规划本地挂载点时要作出对应的调整&lt;/p&gt;&#10;&lt;p&gt;然后创建一个文件保存 SMB 的用户名和密码。这个文件可以保存在个人目录中 /home/&amp;lt;user&amp;gt;/.smbcredentials，也可以保存在其他目录中&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;username=&amp;lt;用户名&amp;gt;&#10;password=&amp;lt;密码&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后编辑 /etc/fstab 文件，添加挂载配置&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;//&amp;lt;smb.server.ip.address&amp;gt;/&amp;lt;smb_shared_dir&amp;gt; /mnt/&amp;lt;local_dir&amp;gt; cifs rw,credentials=/home/&amp;lt;user&amp;gt;/.smbcredentials,uid=&amp;lt;uid&amp;gt;,gid=&amp;lt;gid&amp;gt;,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;保存后用 sudo mount -a 测试配置，没有提示就是一切正常，重启电脑即可&lt;/p&gt;&#10;</description></item><item><title>一波三折的批量重命名脚本 (2)</title><link>https://kngdev.com/post/2024-06-22_%E4%B8%80%E6%B3%A2%E4%B8%89%E6%8A%98%E7%9A%84%E6%89%B9%E9%87%8F%E9%87%8D%E5%91%BD%E5%90%8D%E8%84%9A%E6%9C%AC-2/</link><pubDate>Sat, 22 Jun 2024 18:19:14 +0000</pubDate><guid>https://kngdev.com/post/2024-06-22_%E4%B8%80%E6%B3%A2%E4%B8%89%E6%8A%98%E7%9A%84%E6%89%B9%E9%87%8F%E9%87%8D%E5%91%BD%E5%90%8D%E8%84%9A%E6%9C%AC-2/</guid><description>&lt;p&gt;本以为之后只需要加入定时任务是个很简单的事，但竟然还是让我憋出了个 (2)……&lt;/p&gt;&#10;&lt;p&gt;定时任务本身很简单， cron -e 就行了，但是可能是这 NAS 系统（UGOS Pro）的限制，需要用 sudo cron -e -u username 来完成&lt;/p&gt;&#10;&lt;p&gt;不过也无所谓，定好任务每小时执行一次，但之后看文件一直也没移动。以为还是系统限制了 cron 的原因，用命令 grep CRON /var/log/syslog 查了一下，有记录，单纯是没执行成功&lt;/p&gt;&#10;&lt;p&gt;试了下直接执行脚本，失败，提示 line 7: syntax error: unexpected end of file&lt;/p&gt;&#10;&lt;p&gt;以为是命令漏写了什么，但是逐行复制出来却都能正常执行&lt;/p&gt;&#10;&lt;p&gt;不对啊！我这文件只有 6 行啊，高度怀疑是文件格式问题了&lt;/p&gt;&#10;&lt;p&gt;用 vi 打开脚本文件，:set ff 一看，果然 format 是 dos。这不行，用 :set ff=unix 把文件格式转成 unix，顺便给 mv 加上 -b 参数以备移动目标有同名文件时做个备份，保存退出。最后完整的脚本大概是这样&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash&#10;&#10;ls /volume1/downloads/anime | grep -e &amp;#39;^\\[ANi\\] 怪人的沙拉碗 \\- [0-9][0-9] \\[1080P\\]\\[Baha\\]\\[WEB\\-DL\\]\\[AAC AVC\\]\\[CHT\\]\\.mp4$&amp;#39; | while read line; do mv -b /volume1/downloads/anime/&amp;#34;$line&amp;#34; /volume1/media/anime/&amp;#34;怪人的沙拉碗&amp;#34;/$(echo $line | sed -e &amp;#39;s/\\[ANi\\] 怪人的沙拉碗 \\- /S01E/&amp;#39; -e &amp;#39;s/ \\[1080P\\]\\[Baha\\]\\[WEB\\-DL\\]\\[AAC AVC\\]\\[CHT\\]//&amp;#39;); done&#10;ls /volume1/downloads/anime | grep -e &amp;#39;^\\[ANi\\] 夜晚的水母不會游泳 \\- [0-9][0-9] \\[1080P\\]\\[Baha\\]\\[WEB\\-DL\\]\\[AAC AVC\\]\\[CHT\\]\\.mp4$&amp;#39; | while read line; do mv -b /volume1/downloads/anime/&amp;#34;$line&amp;#34; /volume1/media/anime/&amp;#34;夜晚的水母不会游泳&amp;#34;/$(echo $line | sed -e &amp;#39;s/\\[ANi\\] 夜晚的水母不會游泳 \\- /S01E/&amp;#39; -e &amp;#39;s/ \\[1080P\\]\\[Baha\\]\\[WEB\\-DL\\]\\[AAC AVC\\]\\[CHT\\]//&amp;#39;); done&#10;ls /volume1/downloads/anime | grep -e &amp;#39;^\\[ANi\\] 轉生為第七王子，隨心所欲的魔法學習之路 \\- [0-9][0-9] \\[1080P\\]\\[Baha\\]\\[WEB\\-DL\\]\\[AAC AVC\\]\\[CHT\\]\\.mp4$&amp;#39; | while read line; do mv -b /volume1/downloads/anime/&amp;#34;$line&amp;#34; /volume1/media/anime/&amp;#34;转生为第七王子，随心所欲的魔法学习之路&amp;#34;/$(echo $line | sed -e &amp;#39;s/\\[ANi\\] 轉生為第七王子，隨心所欲的魔法學習之路 \\- /S01E/&amp;#39; -e &amp;#39;s/ \\[1080P\\]\\[Baha\\]\\[WEB\\-DL\\]\\[AAC AVC\\]\\[CHT\\]//&amp;#39;); done&#10;ls /volume1/downloads/anime | grep -e &amp;#39;^\\[ANi\\] 為美好的世界獻上祝福！3 \\- [0-9][0-9] \\[1080P\\]\\[Baha\\]\\[WEB\\-DL\\]\\[AAC AVC\\]\\[CHT\\]\\.mp4$&amp;#39; | while read line; do mv -b /volume1/downloads/anime/&amp;#34;$line&amp;#34; /volume1/media/anime/&amp;#34;为美好的世界献上祝福！&amp;#34;/$(echo $line | sed -e &amp;#39;s/\\[ANi\\] 為美好的世界獻上祝福！3 \\- /S03E/&amp;#39; -e &amp;#39;s/ \\[1080P\\]\\[Baha\\]\\[WEB\\-DL\\]\\[AAC AVC\\]\\[CHT\\]//&amp;#39;); done&#10;ls /volume1/downloads/anime | grep -e &amp;#39;^\\[Nekomoe kissaten&amp;amp;LoliHouse\\] GIRLS BAND CRY \\- [0-9][0-9] \\[WebRip 1080p HEVC\\-10bit AAC ASSx2\\]\\.mkv$&amp;#39; | while read line; do mv -b /volume1/downloads/anime/&amp;#34;$line&amp;#34; /volume1/media/anime/&amp;#34;GIRLS BAND CRY&amp;#34;/$(echo $line | sed -e &amp;#39;s/\\[Nekomoe kissaten&amp;amp;LoliHouse\\] GIRLS BAND CRY \\- /S01E/&amp;#39; -e &amp;#39;s/ \\[WebRip 1080p HEVC\\-10bit AAC ASSx2\\]//&amp;#39;); done&#10;ls /volume1/downloads/anime | grep -e &amp;#39;^\\[ANi\\] 蔚藍檔案 The Animation \\- [0-9][0-9] \\[1080P\\]\\[Baha\\]\\[WEB\\-DL\\]\\[AAC AVC\\]\\[CHT\\]\\.mp4$&amp;#39; | while read line; do mv -b /volume1/downloads/anime/&amp;#34;$line&amp;#34; /volume1/media/anime/&amp;#34;蔚蓝档案 动画版&amp;#34;/$(echo $line | sed -e &amp;#39;s/\\[ANi\\] 蔚藍檔案 The Animation \\- /S01E/&amp;#39; -e &amp;#39;s/ \\[1080P\\]\\[Baha\\]\\[WEB\\-DL\\]\\[AAC AVC\\]\\[CHT\\]//&amp;#39;); done&#10;ls /volume1/downloads/anime | grep -e &amp;#39;^\\[Nekomoe kissaten&amp;amp;LoliHouse\\] Shuumatsu Train Doko e Iku \\- [0-9][0-9] \\[WebRip 1080p HEVC\\-10bit AAC ASSx2\\]\\.mkv$&amp;#39; | while read line; do mv -b /volume1/downloads/anime/&amp;#34;$line&amp;#34; /volume1/media/anime/&amp;#34;末日列车去哪里？&amp;#34;/$(echo $line | sed -e &amp;#39;s/\\[Nekomoe kissaten&amp;amp;LoliHouse\\] Shuumatsu Train Doko e Iku \\- /S01E/&amp;#39; -e &amp;#39;s/ \\[WebRip 1080p HEVC\\-10bit AAC ASSx2\\]//&amp;#39;); done&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;再尝试，成功&lt;/p&gt;&#10;&lt;p&gt;这下一波三折大概是折完了&lt;/p&gt;&#10;</description></item><item><title>一波三折的批量重命名脚本 (1)</title><link>https://kngdev.com/post/2024-06-22_%E4%B8%80%E6%B3%A2%E4%B8%89%E6%8A%98%E7%9A%84%E6%89%B9%E9%87%8F%E9%87%8D%E5%91%BD%E5%90%8D%E8%84%9A%E6%9C%AC-1/</link><pubDate>Sat, 22 Jun 2024 13:26:57 +0000</pubDate><guid>https://kngdev.com/post/2024-06-22_%E4%B8%80%E6%B3%A2%E4%B8%89%E6%8A%98%E7%9A%84%E6%89%B9%E9%87%8F%E9%87%8D%E5%91%BD%E5%90%8D%E8%84%9A%E6%9C%AC-1/</guid><description>&lt;p&gt;想要弄一个自动定时把下载下来的动画重命名并移动到相应目录的脚本&lt;/p&gt;&#10;&lt;p&gt;原名大概是这样&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-full"&gt;&#10;&lt;img src="https://kngdev.com/images/2024/06/屏幕截图-2024-06-22-131413.png" class="wp-image-64" /&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;想命名成类似 S01E10.mp4 这样&lt;/p&gt;&#10;&lt;p&gt;于是建了一个试验目录和几个叫 测试 01 [TEST].txt 这种文件名的文件&lt;/p&gt;&#10;&lt;p&gt;紧接着就遇到了第一个问题，grep 好像不支持 \d 转义，无法匹配到数字序号。这个简单，用 [0-9] 代替即可。&lt;/p&gt;&#10;&lt;p&gt;然后就按照一些博客写的，用 for &amp;hellip; in &amp;hellip; 来循环，结果如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;rafom@rfm-main-win:~/playground$ for f in $(ls | grep -e &amp;#39;测试 [0-9][0-9] \\[TEST\\]\\.txt&amp;#39;); do echo $f ; done&#10;测试&#10;01&#10;[TEST].txt&#10;测试&#10;02&#10;[TEST].txt&#10;测试&#10;03&#10;rafom@rfm-main-win:~/playground$&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可以看到原文件名被拆开了。查了一下发现 for &amp;hellip; in &amp;hellip; 是以空格、制表符、换行符等特殊字符作为分隔的（而不是只以换行符作为分隔）&lt;/p&gt;&#10;&lt;p&gt;这样显然不行。于是又查了些资料，换用 while read line 实现&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;rafom@rfm-main-win:~/playground$ ls | grep -e &amp;#39;测试 [0-9][0-9] \\[TEST\\]\\.txt&amp;#39; | while read line; do echo $line; done&#10;测试 01 [TEST].txt&#10;测试 02 [TEST].txt&#10;测试 03 [TEST].txt&#10;rafom@rfm-main-win:~/playground$&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这样看起来没问题了。接下来是重命名的部分，用 sed 命令操作字符串&lt;/p&gt;&#10;&lt;p&gt;这里我不知道“删除”部分字符串的参数，于是用了个大概不是正道的办法，用空内容去替换&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;rafom@rfm-main-win:~/playground$ ls | grep -e &amp;#39;测试 [0-9][0-9] \\[TEST\\]\\.txt&amp;#39; | while read line; do echo $line | sed -e &amp;#39;s/测试 /S01E/&amp;#39; -e &amp;#39;s/ \\[TEST\\]//&amp;#39;; done&#10;S01E01.txt&#10;S01E02.txt&#10;S01E03.txt&#10;rafom@rfm-main-win:~/playground$&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;看起来也没问题。接下来加入文件操作命令（为了减少失败后的操作量，这里暂时用 cp 代替 mv）&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;rafom@rfm-main-win:~/playground$ ls | grep -e &amp;#39;测试 [0-9][0-9] \\[TEST\\]\\.txt&amp;#39; | while read line; do cp $line ./test/$(echo $line | sed -e &amp;#39;s/测试 /S01E/&amp;#39; -e &amp;#39;s/ \\[TEST\\]//&amp;#39;); done&#10;cp: target &amp;#39;./test/S01E01.txt&amp;#39; is not a directory&#10;cp: target &amp;#39;./test/S01E02.txt&amp;#39; is not a directory&#10;cp: target &amp;#39;./test/S01E03.txt&amp;#39; is not a directory&#10;rafom@rfm-main-win:~/playground$&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;果不其然失败了……但是这个提示很奇怪：&amp;rsquo;./test/S01E01.txt&amp;rsquo; 不是目录？当然不是，它应该是文件名啊！查了一下没找到强制定义为文件名的方法，也就说明这里不是少了参数的原因。又想了一下，发现可能是源文件的部分在同一行里输入了多个值，也就是说变成了把多个文件复制到一个文件夹的操作，从而导致这个报错。&lt;/p&gt;&#10;&lt;p&gt;$line 那里输入的是“测试 01 [TEST].txt”这样的文件名，看起来是因为这里没有作为一个字符串整体输入进 cp 的第一个参数。那么给它加个引号行不行呢？&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;rafom@rfm-main-win:~/playground$ ls | grep -e &amp;#39;测试 [0-9][0-9] \\[TEST\\]\\.txt&amp;#39; | while read line; do cp &amp;#39;$line&amp;#39; ./test/$(echo $line | sed -e &amp;#39;s/测试 /S01E/&amp;#39; -e &amp;#39;s/ \\[TEST\\]//&amp;#39;); do&#10;ne&#10;cp: cannot stat &amp;#39;$line&amp;#39;: No such file or directory&#10;cp: cannot stat &amp;#39;$line&amp;#39;: No such file or directory&#10;cp: cannot stat &amp;#39;$line&amp;#39;: No such file or directory&#10;rafom@rfm-main-win:~/playground$&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;还是不行……&amp;rsquo;$line&amp;rsquo;看起来是没有引用出变量，而是直接作为一个字符串输入到 cp 里了……那到底怎么办呢？实在想不出办法了，破罐破摔，把单引号改成双引号&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;rafom@rfm-main-win:~/playground$ ls | grep -e &amp;#39;测试 [0-9][0-9] \\[TEST\\]\\.txt&amp;#39; | while read line; do cp &amp;#34;$line&amp;#34; ./test/$(echo $line | sed -e &amp;#39;s/测试 /S01E/&amp;#39; -e &amp;#39;s/ \\[TEST\\]//&amp;#39;); done&#10;rafom@rfm-main-win:~/playground$&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;什么？竟然成功了？进到 test 目录里看，想要的文件果然出现了&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-full"&gt;&#10;&lt;img src="https://kngdev.com/images/2024/06/屏幕截图-2024-06-22-134837.png" class="wp-image-67" /&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;把文件删了，给测试用的源文件里编辑一些内容，然后把命令里的 cp 换成 mv，为了放进定时脚本再加上绝对路径&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;rafom@rfm-main-win:~/playground$ ls /home/rafom/playground | grep -e &amp;#39;测试 [0-9][0-9] \\[TEST\\]\\.txt&amp;#39; | while read line; do mv /home/rafom/playground/&amp;#34;$line&amp;#34; /home/rafom/playground/test/$(echo $line | sed -e &amp;#39;s/测试 /S01E/&amp;#39; -e &amp;#39;s/ \\[TEST\\]//&amp;#39;); done&#10;rafom@rfm-main-win:~/playground$&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;成功！虽然不知道为什么单引号不行但双引号可以，总之是成功了！&lt;/p&gt;&#10;&lt;p&gt;bash 对我等绿皮来说还是太难了&lt;/p&gt;&#10;</description></item><item><title>记录一下给自己的 openwrt 整的简易每日备份</title><link>https://kngdev.com/post/2024-06-06_%E8%AE%B0%E5%BD%95%E4%B8%80%E4%B8%8B%E7%BB%99%E8%87%AA%E5%B7%B1%E7%9A%84-openwrt-%E6%95%B4%E7%9A%84%E7%AE%80%E6%98%93%E6%AF%8F%E6%97%A5%E5%A4%87%E4%BB%BD/</link><pubDate>Thu, 06 Jun 2024 07:13:20 +0000</pubDate><guid>https://kngdev.com/post/2024-06-06_%E8%AE%B0%E5%BD%95%E4%B8%80%E4%B8%8B%E7%BB%99%E8%87%AA%E5%B7%B1%E7%9A%84-openwrt-%E6%95%B4%E7%9A%84%E7%AE%80%E6%98%93%E6%AF%8F%E6%97%A5%E5%A4%87%E4%BB%BD/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;FILENAME=n100wrt-$(date +%a | tr A-Z a-z)&#10;echo START: $(date) &amp;gt;/root/localbackup/$FILENAME.log&#10;cat /root/localbackup/run-backup.sh &amp;gt;&amp;gt; /root/localbackup/$FILENAME.log&#10;tar -cvpzf /root/localbackup/$FILENAME.tar.gz --exclude=/root/localbackup --exclude=/proc --exclude=/mnt --exclude=/lost+found --exclude=/sys / &amp;gt;&amp;gt;/root/localbackup/$FILENAME.log 2&amp;gt;&amp;amp;1&#10;rsync -avL /root/localbackup/$FILENAME.tar.gz homebackup@192.168.100.10:~/n100wrt &amp;gt;&amp;gt;/root/localbackup/$FILENAME.log 2&amp;gt;&amp;amp;1&#10;echo END: $(date) &amp;gt;&amp;gt;/root/localbackup/$FILENAME.log&#10;rsync -avL /root/localbackup/$FILENAME.log homebackup@192.168.100.10:~/n100wrt&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;基本作用是备份全部存储空间，附带生成带有开始时间、脚本内容、报错、以及结束时间的日志，同步到另一服务器，并且只保留最近一周的备份。逐行解释：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;设置一个名为 FILENAME 的变量，变量值为 n100wrt-当前星期的英文小写简写，比如今天是星期一，变量就是 n100wrt-mon&lt;/li&gt;&#10;&lt;li&gt;把当前时间写入日志文件（会清除原有的文件内容）&lt;/li&gt;&#10;&lt;li&gt;把脚本内容追加写入到日志文件&lt;/li&gt;&#10;&lt;li&gt;使用 tar 压缩存储文件，排除部分目录，尤其注意排除备份文件或存储备份文件的目录。然后将报错追加写入日志文件（ 2&amp;gt;&amp;amp;1 作用是将标准错误输出重定向到标准输出）&lt;/li&gt;&#10;&lt;li&gt;使用 rsync 同步备份文件，然后将报错追加写入日志文件。这里需要提前设置好登录凭证，以避免出现交互请求&lt;/li&gt;&#10;&lt;li&gt;把当前时间追加写入日志文件&lt;/li&gt;&#10;&lt;li&gt;使用 rsync 同步日志文件&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;然后在 crontab 里添加一行 5 5 * * * /root/localbackup/run-backup.sh，让它每天早上 5 点 5 分自动运行，一个简易的自动每日备份就完成了&lt;/p&gt;&#10;</description></item><item><title>在 homelab 上安装 homeassistant (3)</title><link>https://kngdev.com/post/2024-05-17_%E5%9C%A8-homelab-%E4%B8%8A%E5%AE%89%E8%A3%85-homeassistant-3/</link><pubDate>Fri, 17 May 2024 17:23:05 +0000</pubDate><guid>https://kngdev.com/post/2024-05-17_%E5%9C%A8-homelab-%E4%B8%8A%E5%AE%89%E8%A3%85-homeassistant-3/</guid><description>&lt;p&gt;之前安装虚拟机的时候（按照官方指引）没有设置自动启动。试了一下把宿主机重启之后，果然 homeassistant 没有跟着自动启动……&lt;/p&gt;&#10;&lt;p&gt;KVM 中查看虚拟机运行状态的命令是 virsh list，设置自动启动的命令是 virsh autostart domain（例如 virstart autostart hass），设置之后还需要用 virsh start hass 命令启动虚拟机&lt;/p&gt;&#10;&lt;p&gt;顺手在路由器里给名为 homeassistant 的主机绑定了 IP 地址，然后用 virsh reboot hass 重启了 homeassistant，nslookup 确认绑定成功&lt;/p&gt;&#10;&lt;p&gt;（话说为什么我 nslookup homeassistant.local 提示找不到，nslookup homeassistant.lan 能找到，但是在浏览器里用 nslookup homeassistant.local 这个网址又能访问？神奇……）&lt;/p&gt;&#10;</description></item><item><title>玩 homeassisant (1)</title><link>https://kngdev.com/post/2024-05-17_%E7%8E%A9-homeassisant-1/</link><pubDate>Fri, 17 May 2024 17:11:06 +0000</pubDate><guid>https://kngdev.com/post/2024-05-17_%E7%8E%A9-homeassisant-1/</guid><description>&lt;p&gt;搞定了！&lt;/p&gt;&#10;&lt;p&gt;在 Preparing 那里等了挺久的时间，但查了下别人的讨论，好像有等更久的。好在现在成功进入配置页面了&lt;/p&gt;&#10;&lt;p&gt;设置城市的时候输入我城市的名字报错……没理它就用默认地址，先进入正式界面再说&lt;/p&gt;&#10;&lt;p&gt;配置完毕之后在 配置 - 区域、标签和地点 - 地点 里，编辑 我的家，然后用鼠标拖动图钉钉到了我家的位置&lt;/p&gt;&#10;&lt;p&gt;先这样，我先回去看一下自动启动的问题&lt;/p&gt;&#10;</description></item><item><title>在 homelab 上安装 homeassistant (2)</title><link>https://kngdev.com/post/2024-05-17_%E5%9C%A8-homelab-%E4%B8%8A%E5%AE%89%E8%A3%85-homeassistant-2/</link><pubDate>Fri, 17 May 2024 16:40:49 +0000</pubDate><guid>https://kngdev.com/post/2024-05-17_%E5%9C%A8-homelab-%E4%B8%8A%E5%AE%89%E8%A3%85-homeassistant-2/</guid><description>&lt;p&gt;首先是 Home Assistant 的&lt;a class="link" href="https://www.home-assistant.io/installation/linux" target="_blank" rel="noopener"&#10; &gt;官方文档&lt;/a&gt;，使用 Hypervisor specific cconfiguration 下 KVM (virt-install) 里的命令（对应无图形界面的 Ubuntu Server 操作系统）&lt;/p&gt;&#10;&lt;p&gt;但是参考&lt;a class="link" href="https://www.dzombak.com/blog/2024/02/Setting-up-KVM-virtual-machines-using-a-bridged-network.html" target="_blank" rel="noopener"&#10; &gt;这篇文章&lt;/a&gt;里配置和分配网络的办法，在命令后加 &amp;ndash;network network=br0-network 参数（具体网络名称可以先用 virsh net-list &amp;ndash;all 命令查看&lt;/p&gt;&#10;&lt;p&gt;然后出现两个提示&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;WARNING /home/rafom/vm/home_assistant/haos_ova-12.3.qcow2 may not be accessible by the hypervisor. You will need to grant the &amp;#39;libvirt-qemu&amp;#39; user search permissions for the following directories: [&amp;#39;/home/rafom&amp;#39;]&#10;&#10;ERROR Cannot access storage file &amp;#39;/home/rafom/vm/home_assistant/haos_ova-12.3.qcow2&amp;#39; (as uid:64055, gid:108): Permission denied&#10;&lt;/code&gt;&lt;/pre&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;先尝试 chmod 766 给到 haos_ova-12.3.qcow2 但好像问题还在，然后按照提示去改用户目录的权限，使用命令是 sudo setfacl -m u:libvirt-qemu:rx /home/rafom&lt;/p&gt;&#10;&lt;p&gt;好像可以了，出现了 homeassistant login 提示。到这里时候我还去找 homeassistant 的默认登录信息，然后发现大家说直接从 &lt;a class="link" href="http://homeassistant.local:8123/" target="_blank" rel="noopener"&#10; &gt;http://homeassistant.local:8123/&lt;/a&gt; 登录就行了&lt;/p&gt;&#10;&lt;p&gt;homelab 是无图形界面的系统（又称 headless server？），所以从主设备上访问，成功&lt;/p&gt;&#10;&lt;p&gt;现在网页上显示 Preparing Home Assistant，This may take up to 20 minutes&lt;/p&gt;&#10;&lt;p&gt;等吧……&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item><item><title>折腾备案号 (3)</title><link>https://kngdev.com/post/2024-05-16_%E6%8A%98%E8%85%BE%E5%A4%87%E6%A1%88%E5%8F%B7-3/</link><pubDate>Thu, 16 May 2024 20:48:07 +0000</pubDate><guid>https://kngdev.com/post/2024-05-16_%E6%8A%98%E8%85%BE%E5%A4%87%E6%A1%88%E5%8F%B7-3/</guid><description>&lt;p&gt;行，最终选择换主题了&lt;/p&gt;&#10;&lt;p&gt;换成了 &lt;a class="link" href="https://github.com/Licoy/wordpress-theme-puock" target="_blank" rel="noopener"&#10; &gt;puock 主题&lt;/a&gt;，然后它可设置的页脚信息还是不能使用简码，但是可以使用 HTML&lt;/p&gt;&#10;&lt;p&gt;就这样吧，不再折腾了&lt;/p&gt;&#10;</description></item><item><title>在 homelab 上安装 homeassistant (1)</title><link>https://kngdev.com/post/2024-05-16_%E5%9C%A8-homelab-%E4%B8%8A%E5%AE%89%E8%A3%85-homeassistant--1/</link><pubDate>Thu, 16 May 2024 15:49:02 +0000</pubDate><guid>https://kngdev.com/post/2024-05-16_%E5%9C%A8-homelab-%E4%B8%8A%E5%AE%89%E8%A3%85-homeassistant--1/</guid><description>&lt;p&gt;折腾网络可真烦，主要是建立网桥的操作不容易搞懂，明显比 Hyper-V 的虚拟交换机要复杂&lt;/p&gt;&#10;&lt;p&gt;一开始用的是 DHCP，后来想了想还是弄成固定 IP 了&lt;/p&gt;&#10;&lt;p&gt;参考了是这篇文章： &lt;a class="link" href="https://blog.chaosjohn.com/Create-br0-without-losing-connection-under-Ubuntu-22-04.html" target="_blank" rel="noopener"&#10; &gt;Ubuntu 22.04 单网卡创建br0(免断网)&lt;/a&gt;，选它有一个额外的原因是我搞不明白为什么建立网桥之后我设备的 MAC 地址变了，所以也不知道在 netplan 里应该写哪个 MAC 地址，所以选了不需要写 MAC 地址的配置&lt;/p&gt;&#10;&lt;p&gt;接下来是安装虚拟机，祝我成功&lt;/p&gt;&#10;</description></item><item><title>折腾备案号 (2)</title><link>https://kngdev.com/post/2024-05-16_%E6%8A%98%E8%85%BE%E5%A4%87%E6%A1%88%E5%8F%B7-2/</link><pubDate>Thu, 16 May 2024 11:43:18 +0000</pubDate><guid>https://kngdev.com/post/2024-05-16_%E6%8A%98%E8%85%BE%E5%A4%87%E6%A1%88%E5%8F%B7-2/</guid><description>&lt;p&gt;好消息：文派备案的简码是有效的&lt;/p&gt;&#10;&lt;p&gt;坏消息：这个主题的真页脚（版权信息）好像不支持富文本，什么简码啦 html 代码之类的都不行&lt;/p&gt;&#10;&lt;p&gt;但是备案信息的规范格式是要附带指向查询网站的链接的&lt;/p&gt;&#10;&lt;p&gt;只好在页脚里加入一个文本小工具来实现了。但是说实话，好丑啊！&lt;/p&gt;&#10;&lt;p&gt;有空再想想别的办法&lt;/p&gt;&#10;</description></item><item><title>折腾备案号 （1）</title><link>https://kngdev.com/post/2024-05-16_%E6%8A%98%E8%85%BE%E5%A4%87%E6%A1%88%E5%8F%B7-1/</link><pubDate>Thu, 16 May 2024 11:23:24 +0000</pubDate><guid>https://kngdev.com/post/2024-05-16_%E6%8A%98%E8%85%BE%E5%A4%87%E6%A1%88%E5%8F%B7-1/</guid><description>&lt;p&gt;把备案号放到页脚里，本来是个不麻烦的操作，但我想进一步图省事不要自己写 html，就整了个叫文派备案的插件&lt;/p&gt;&#10;&lt;p&gt;但是好像不管用！说是写简码就会自动替换为备案号，但是放在页脚里却还是简码原来的样子&lt;/p&gt;&#10;&lt;p&gt;不知道正文里能不能转换，来试一下 [wpicp_license] [wpicp_wangan]&lt;/p&gt;&#10;</description></item><item><title>替换导航站为 WebStack-Hugo</title><link>https://kngdev.com/post/2024-05-16_%E6%9B%BF%E6%8D%A2%E5%AF%BC%E8%88%AA%E7%AB%99%E4%B8%BA-webstack-hugo/</link><pubDate>Thu, 16 May 2024 10:44:05 +0000</pubDate><guid>https://kngdev.com/post/2024-05-16_%E6%9B%BF%E6%8D%A2%E5%AF%BC%E8%88%AA%E7%AB%99%E4%B8%BA-webstack-hugo/</guid><description>&lt;p&gt;不知道为什么，放在 sitepath/assets 里的素材无法自动复制进 public 目录&lt;/p&gt;&#10;&lt;p&gt;尝试改 hugo.toml，加入 [[module.moounts]] 字段也不管用&lt;/p&gt;&#10;&lt;p&gt;只好上土办法，在 deploy 脚本里直接用 rsync 把 sitepath/assets/ 单独同步过去了&lt;/p&gt;&#10;</description></item></channel></rss>