V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
dazkarieh
V2EX  ›  Linux

外行求 find 写法

  •  
  •   dazkarieh · Feb 16, 2019 · 4859 views
    This topic created in 2636 days ago, the information mentioned may be changed or developed.

    最近在整理硬盘(水果机),想删除 /downloads 目录下所有 mht 类型的文件。

    无奈神秘代码太多,不能一一删除,所以在终端试了下 find 命令

    find . -name "*.mht"  | xargs rm -f 
    

    发现还有漏网之鱼。

    ./1118 -1141/{最新国产日韩欧美新片合集发布}.mht
    ./1118 -1141/_1024 核工厂最新地址.mht
    ./1119 -2318-01-10/{最新国产日韩欧美新片合集发布}.mht
    ./1119 -2318-01-10/_1024 核工厂最新地址.mht
    ./1109 -0680/{最新国产日韩欧美新片合集发布}.mht
    ./1109 -0680/_1024 核工厂最新地址.mht
    ./1117 -0413/{最新国产日韩欧美新片合集发布}.mht
    ./1117 -0413/_1024 核工厂最新地址.mht    
    

    *.mht 难道不能包含所有 mht 类型的文件吗,求正解 o(╯□╰)o

    21 replies    2019-02-17 13:59:47 +08:00
    Valyrian
        1
    Valyrian  
       Feb 16, 2019
    双引号换成单引号
    Valyrian
        2
    Valyrian  
       Feb 16, 2019
    当我没说- -
    dazkarieh
        3
    dazkarieh  
    OP
       Feb 16, 2019
    @Valyrian 改了,结果还是一样
    sdijeenx
        4
    sdijeenx  
       Feb 16, 2019
    find . -name *.mht -exec rm -rvf {} \;
    aocif23
        5
    aocif23  
       Feb 16, 2019
    先用 find . -name "*.mht" 看看能匹配到不。

    我一般这样用的。
    find . -name "*.mht" | xargs -i rm -rf {}
    aocif23
        6
    aocif23  
       Feb 16, 2019   ❤️ 1
    另外,老歌借一部说话 [滑稽]
    zbinlin
        7
    zbinlin  
       Feb 16, 2019   ❤️ 1
    find . -name '*.mht' -delete

    find . -name '*.mht' -exec rm '{}' \;

    find . -name '*.mht' -print0 | xargs -0 rm -f
    luozic
        8
    luozic  
       Feb 16, 2019 via iPhone
    最好先输出到一个文本里面,检查一下之后直接按 list 删掉
    sdijeenx
        9
    sdijeenx  
       Feb 16, 2019
    @luozic 有道理,可以在 rm 后边加个-i 输入 y 才会删除文件像这样:
    find . -name *.mht -exec rm -i {} \;
    dazkarieh
        10
    dazkarieh  
    OP
       Feb 16, 2019
    @sdijeenx 谢谢老哥,一句话搞定。
    @zbinlin 大哥你牛逼,玩出花式来了
    @aocif23 试了这位老哥的,显示
    ```bash
    xargs: illegal option -- i
    usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr]
    [-L number] [-n number [-x]] [-P maxprocs] [-s size]
    [utility [argument ...]]
    ```
    hguandl
        11
    hguandl  
       Feb 16, 2019
    推荐楼上的那个 print0 写法,能解决一些奇怪字符造成的问题。而且 xargs -0 就是专门和 find -print0 对接的参数,非常适合搭配使用。
    misaka19000
        12
    misaka19000  
       Feb 16, 2019 via Android
    用 python 写会简单很多
    ipwx
        13
    ipwx  
       Feb 16, 2019
    我最近喜欢这么用:

    find . -name "*.xxx" -exec bash -c '
    FN="{}"
    ... 然后你就可以随便怎么写了
    ' \;
    quinoa42
        14
    quinoa42  
       Feb 17, 2019
    没删成是因为空格在 expand 之后被当成 arg 分隔符了吧
    shuangyeying
        15
    shuangyeying  
       Feb 17, 2019
    学了一招,之前都是设置成只搜索当前文件夹,然后搜索后缀名,然后直接删除。
    richzhu
        16
    richzhu  
       Feb 17, 2019 via iPhone
    为什么要 find 你这个需求 直接 rm -rf *.mht
    billgreen1
        17
    billgreen1  
       Feb 17, 2019   ❤️ 1
    @richzhu *.mht 会被扩展成具体的文件名,文件数量过多后 rm 就搞不定了,这个数量具体是多少得查查。
    sparkssssssss
        18
    sparkssssssss  
       Feb 17, 2019 via iPhone
    @richzhu 多级目录
    sparkssssssss
        19
    sparkssssssss  
       Feb 17, 2019 via iPhone
    有大括号,估计 rm 报错了?
    用 inode 删
    richzhu
        20
    richzhu  
       Feb 17, 2019 via iPhone
    @billgreen1 他不是就要删除 mht 扩展名嘛,不根据需求来嘛😂 他能有几个文件……
    iwtbauh
        21
    iwtbauh  
       Feb 17, 2019 via Android
    既然是 Linux 节点,我默认你用的是 GNU find

    GNU find 有一个 '-delete' 选项



    find . -name "*.mht" -delete
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5607 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 09:10 · PVG 17:10 · LAX 02:10 · JFK 05:10
    ♥ Do have faith in what you're doing.