V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hwdq0012
V2EX  ›  程序员

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

  •  
  •   hwdq0012 ·
    nocanstillbb · 4 天前 · 1278 次点击

    之前在写的 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 指改了

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

    你可以试试在 git bash 中执行命令行。基本的 linux 命令都可用。
    hwdq0012
        8
    hwdq0012  
    OP
       4 天前
    @skiy #7:VSCode 创建的文件默认是 CRLF 这个是操作系统决定的,linux 默认 utf8 + LF ,mac 默认 utf8+ CR ,windows 默认根据语言地区 + CRLF, wsl2 + windows 版本都满足条件,bios 里打开 cpu 虚拟化后,才能在 wsl 里安装 docker
    zed1018
        9
    zed1018  
       4 天前
    @hwdq0012 #3 podman desktop 我记得也是有 wsl backend 的
    Need4more
        10
    Need4more  
       4 天前 via iPhone
    cmd 的 forfiles 命令
    guanzhangzhang
        11
    guanzhangzhang  
       4 天前
    @hwdq0012 #2 windows 安装个 git bash 吧,或者自带的 powershell ,或者编译型语言 golang 写个试试
    huangsijun17
        12
    huangsijun17  
       3 天前
    盲猜,$0 被 wsl 解析了,而不是 bash 。
    hwdq0012
        13
    hwdq0012  
    OP
       3 天前
    @huangsijun17 #12 我把$0 改为$1 ,它不会被替换为 wsl 的第二个参数(bash 的第 1 个参数)
    huangsijun17
        14
    huangsijun17  
       3 天前   ❤️ 1
    @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
        15
    hwdq0012  
    OP
       3 天前
    ""立即解析, ' 延迟解析,和 git submodule 的 foreach 命令一样, 不过我这个' 里的命令是想让 find 解析,看来是没办法了
    hwdq0012
        16
    hwdq0012  
    OP
       3 天前
    @huangsijun17 #14 ""立即解析, ' 延迟解析,和 git submodule 的 foreach 命令一样, 不过我这个' 里的命令是想让 find 解析,看来是没办法了
    huangsijun17
        17
    huangsijun17  
       3 天前
    @hwdq0012 #16 加\转译试试看?
    huangsijun17
        18
    huangsijun17  
       3 天前
    @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
        19
    hwdq0012  
    OP
       3 天前
    @huangsijun17 #18 不折腾了,我在 wsl 里安装了 rename
    ```bash
    rename "s/\.text$/\.predict/" *.txt
    ```
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   905 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 21:38 · PVG 05:38 · LAX 14:38 · JFK 17:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.