【问题标题】:Need a shell script that deletes all files except *.pdf需要一个删除除 *.pdf 之外的所有文件的 shell 脚本
【发布时间】:2011-01-15 22:46:31
【问题描述】:

任何人都可以编写一个 shell 脚本来删除文件夹中的所有文件,但扩展名为 pdf 的文件除外?

【问题讨论】:

    标签: bash shell sh delete-file


    【解决方案1】:

    这将包括所有子目录:

    find . -type f ! -iname '*.pdf' -delete
    

    这只会在当前目录中起作用:

    find . -maxdepth 1 -type f ! -iname '*.pdf' -delete
    

    【讨论】:

    • 这也会删除子目录中的非pdf文件
    【解决方案2】:
    $ ls -1 | grep -v '.pdf$' | xargs -I {} rm -i {}
    

    或者,如果你有信心:

    $ ls -1 | grep -v '.pdf$' | xargs -I {} rm {}
    

    或者,防弹版本:

    $ find . -maxdepth 1 -type f ! -iname '*.pdf' -delete
    

    【讨论】:

    • ls 输出旨在显示给用户,而不是解析。 ls 可以替换字符或重新格式化文件名,以便将其呈现给用户。
    • {}"{}" 对 shell 没有影响,它是传递给命令的单个参数
    • 它仍然是错误的,因为ls 并不是要生成要被其他工具解析的文件列表。 ls 旨在生成用户可读的文件列表,通过使其用户可读,ls 可能会替换文件名中的字符,这可能会导致错误的结果。 touch $'A file\nwith a newline' 将创建一个会破坏您的命令的文件。
    • @Juliano,同意并赞成您的回答 - 但我必须说,我(幸运的是)还没有看到包含换行符的文件名。
    • @miku touch $'a\nfile\nwith\nnewlines\nin\nits\nname'.
    【解决方案3】:

    这应该可以解决问题:

    shopt -s extglob
    rm !(*.pdf)
    

    【讨论】:

    • 如果你shopt -s failglob会更好。
    【解决方案4】:
    ls | grep -v '.pdf$' | xargs rm
    

    这将过滤所有不以 PDF 结尾的文件,并对它们执行 RM

    【讨论】:

    • 嗯,显然是这样。以前没注意过,谢谢指点!
    • 这太可怕了! 不要使用它: 解析ls 的输出是非常糟糕的做法,它会以多种方式中断(文件名带有空格或以连字符开头)。
    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2015-11-27
    • 2015-01-02
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多