今日遇到的 wsl bash 执行 find 命令的问题,没正面解决

22 小时 3 分钟前
 hwdq0012

之前在写的 linux 程序会调 bash + find 命令批量改文件的后辍名

find /path2myDir/predict/labels -name \"*.txt\" -exec sh -c 'mv \"$0\"  \"${0%.txt}.predict\"' {} \\;

改为 windows 版本后, bash -c "command" 换成了 wsl bash -c "command..."
其他的命令都执行很正常,但这条重命令的命令一直失败,于是加了-x 把 wsl 执行的命令打印出来

"+ find /path2myDir/predict/labels -name '*.txt' -exec sh -c 'mv \"/bin/bash\" \"/bin/bash.predict\"' '{}' ';'

不知道为什么$0变成/bin/bash\ , 我尝过把$0 改为 1 也没有用

折腾了很久,最后在 wsl 里安装了 rename , 用 rename 指改了

739 次点击
所在节点    程序员
19 条回复
guanzhangzhang
21 小时 28 分钟前
因为变量先被本地展开了
hwdq0012
21 小时 19 分钟前
@guanzhangzhang #1 $0 被替换为/bin/bash ,这确实很像被提前展开, 但 ${0%.text}.predict 都也被替换为/bin/bash/.predict 了
skiy
21 小时 2 分钟前
可以让 AI 教你用 PowerShell 来改。虽然跟 linux 命令和参数用法不一样,但应该更好实现。最近改了几个 ps1 ,感觉还可以。就是英文不太好,参数和命令用的都是单词,没有短参。
hwdq0012
20 小时 56 分钟前
@skiy #3 倒不是不可以, 不过为了规避 docker desktop 的 license , 目前在 wsl 里安装了 docker CE , 且 windows 还有个问题就是我知道是 utf8 ,windows 是 utf8 ,如果用 Powershell 或 cmd , 进程接到的 标准流需要做编码转换 ,所以就继续用 bash 了
fuzzsh
20 小时 54 分钟前
看着像将命令写入文件,wsl 执行就运行
hwdq0012
20 小时 50 分钟前
@fuzzsh #5 可以在 cmd 或 powershell 里直接 wsl ls -l > 1.txt ,没有写文件
skiy
20 小时 48 分钟前
@hwdq0012 Windows 下有几个问题:VSCode 创建的文件默认是 CRLF ,不是 Linux 等平台的 LF 。
另外,我在 wsl 装不上 docker 。好像是缺了虚拟化的东西。现在解决方案还是得装一个 Docker Desktop 。

你可以试试在 git bash 中执行命令行。基本的 linux 命令都可用。
hwdq0012
20 小时 44 分钟前
@skiy #7:VSCode 创建的文件默认是 CRLF 这个是操作系统决定的,linux 默认 utf8 + LF ,mac 默认 utf8+ CR ,windows 默认根据语言地区 + CRLF, wsl2 + windows 版本都满足条件,bios 里打开 cpu 虚拟化后,才能在 wsl 里安装 docker
zed1018
20 小时 19 分钟前
@hwdq0012 #3 podman desktop 我记得也是有 wsl backend 的
Need4more
20 小时 3 分钟前
cmd 的 forfiles 命令
guanzhangzhang
17 小时 49 分钟前
@hwdq0012 #2 windows 安装个 git bash 吧,或者自带的 powershell ,或者编译型语言 golang 写个试试
huangsijun17
6 小时 52 分钟前
盲猜,$0 被 wsl 解析了,而不是 bash 。
hwdq0012
6 小时 43 分钟前
@huangsijun17 #12 我把$0 改为$1 ,它不会被替换为 wsl 的第二个参数(bash 的第 1 个参数)
huangsijun17
3 小时 55 分钟前
@hwdq0012 #13 我试了一下 echo:


PS C:\Users\huang> wsl bash -c "echo $0"
wsl: 检测到 localhost 代理配置,但未镜像到 WSL 。NAT 模式下的 WSL 不支持 localhost 代理。

PS C:\Users\huang> wsl bash -c 'echo $0'
wsl: 检测到 localhost 代理配置,但未镜像到 WSL 。NAT 模式下的 WSL 不支持 localhost 代理。
/bin/bash
PS C:\Users\huang>
hwdq0012
3 小时 47 分钟前
""立即解析, ' 延迟解析,和 git submodule 的 foreach 命令一样, 不过我这个' 里的命令是想让 find 解析,看来是没办法了
hwdq0012
3 小时 47 分钟前
@huangsijun17 #14 ""立即解析, ' 延迟解析,和 git submodule 的 foreach 命令一样, 不过我这个' 里的命令是想让 find 解析,看来是没办法了
huangsijun17
3 小时 10 分钟前
@hwdq0012 #16 加\转译试试看?
huangsijun17
3 小时 2 分钟前
@huangsijun17 #17 powershell 转译用`符号:

PS C:\Users\huang> wsl -- bash -c "echo `$0"
wsl: 检测到 localhost 代理配置,但未镜像到 WSL 。NAT 模式下的 WSL 不支持 localhost 代理。
/bin/bash
PS C:\Users\huang>
hwdq0012
2 小时 26 分钟前
@huangsijun17 #18 不折腾了,我在 wsl 里安装了 rename
```bash
rename "s/\.text$/\.predict/" *.txt
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1155614

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX