V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
dazkarieh
V2EX  ›  Linux

外行求 find 写法

  •  
  •   dazkarieh · 2019-02-16 19:27:55 +08:00 · 4409 次点击
    这是一个创建于 2099 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在整理硬盘(水果机),想删除 /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 条回复    2019-02-17 13:59:47 +08:00
    Valyrian
        1
    Valyrian  
       2019-02-16 19:29:09 +08:00
    双引号换成单引号
    Valyrian
        2
    Valyrian  
       2019-02-16 19:31:23 +08:00
    当我没说- -
    dazkarieh
        3
    dazkarieh  
    OP
       2019-02-16 19:31:31 +08:00
    @Valyrian 改了,结果还是一样
    sdijeenx
        4
    sdijeenx  
       2019-02-16 19:39:08 +08:00
    find . -name *.mht -exec rm -rvf {} \;
    aocif23
        5
    aocif23  
       2019-02-16 19:43:03 +08:00
    先用 find . -name "*.mht" 看看能匹配到不。

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

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

    find . -name '*.mht' -print0 | xargs -0 rm -f
    luozic
        8
    luozic  
       2019-02-16 19:48:13 +08:00 via iPhone
    最好先输出到一个文本里面,检查一下之后直接按 list 删掉
    sdijeenx
        9
    sdijeenx  
       2019-02-16 19:58:28 +08:00
    @luozic 有道理,可以在 rm 后边加个-i 输入 y 才会删除文件像这样:
    find . -name *.mht -exec rm -i {} \;
    dazkarieh
        10
    dazkarieh  
    OP
       2019-02-16 20:39:58 +08:00
    @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  
       2019-02-16 20:44:25 +08:00
    推荐楼上的那个 print0 写法,能解决一些奇怪字符造成的问题。而且 xargs -0 就是专门和 find -print0 对接的参数,非常适合搭配使用。
    misaka19000
        12
    misaka19000  
       2019-02-16 20:51:15 +08:00 via Android
    用 python 写会简单很多
    ipwx
        13
    ipwx  
       2019-02-16 21:44:25 +08:00
    我最近喜欢这么用:

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

    GNU find 有一个 '-delete' 选项



    find . -name "*.mht" -delete
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2752 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:50 · PVG 22:50 · LAX 06:50 · JFK 09:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.