【问题标题】:How to delete all the files/folders from the folder except few folders?如何从文件夹中删除除少数文件夹外的所有文件/文件夹?
【发布时间】:2014-08-08 07:10:09
【问题描述】:

我正在尝试为 debian 包编写维护脚本。 假设我的目录结构如下:

application/
----application/file1.txt
----application/file2.txt
----application/config
--------application/config/c1.conf
--------application/config/c2.conf
----application/logs
--------application/logs/l1.txt
--------application/logs/l2.txt
----application/src
--------application/src/static/
------------application/src/static/js
------------application/src/static/css
--------application/src/s1.py
--------application/src/s2.py
----application/lib
--------application/src/js/
--------application/src/css/

现在我想删除除configlogs 之外的所有文件/文件夹(在本例中为srclib 文件夹,以及file1.txtfile2.txt 文件)。我的PWD 目前是appliaction/ 目录的父级(即,我可以在PWD 中看到application)。

我应该使用什么命令(一个小的bash script 会很棒)? (我用rm -rf尝试了一些选项,但错误地删除了其他文件,所以我想在尝试其他任何事情之前知道正确答案!)

【问题讨论】:

  • 您尝试了哪些选项?因为你可以用普通的rm 做到这一点(见我的回答)。

标签: bash ubuntu rm delete-directory


【解决方案1】:

据我所知,除了src 之外,还有很多其他文件夹,否则你只会使用rm -rf src

如果您的PWDapplication,即您位于config logssrc 的父目录中,您只需要在除@ 之外的所有文件/文件夹上使用rm -rf 987654329@ 和 log,那为什么不做一个 for 循环呢?

    #!/bin/bash

    cd "/path/to/application"

    for file in * ; do
            case "$file" in
                    config )
                            echo "file is $file: doing nothing"
                    ;;
                    logs )
                            echo "file is $file: doing nothing"
                    ;;
                    * )
                            echo "file is $file: removing"
                            rm -rf "$file"
                    ;;
                    esac
            done
    exit 0

【讨论】:

  • 这不会删除文件。
  • 请查看编辑下的原帖。它专门说文件夹。在我提供答案后,“文件/文件夹”被添加到问题中。在任何情况下,要删除文件,只需从上面删除 if 语句,并假设没有任何名为 config 或 logs 的文件没有任何扩展名,此脚本将按预期工作。
  • 啊,我讨厌人们如此显着地改变他们的问题。但也许最好删除 if 语句以保持一致?
  • 当然,进行了更改。我是这些论坛的新手,不太确定在提供正确答案后更改原始帖子时的礼仪是什么。如果你没有指出更新的问题,我可能永远不会检查这个。
  • 好吧,通常情况下它并没有真正受到赞赏,但在这种情况下它并没有太大的伤害。我投了赞成票,因为这个解决方案应该可以工作,尽管我认为我的更好;)
【解决方案2】:

这必须有效:

find ./application -depth -mindepth 1 -type d \
  -regextype posix-extended ! -regex ".*\/(config|logs).*" | \
  -exec rm -fr {}  \;

或者使用xargs,如果您没有包含换行符的文件夹名称,您可以编写:

find ./application -depth -mindepth 1 -type d \
  -regextype posix-extended ! -regex ".*\/(config|logs).*" | \
  xargs -t -I {} rm -fr {}

或者xargs,如果您的文件夹名称中包含换行符,您可以使用:

find ./application -depth -mindepth 1 -type d \
  -regextype posix-extended ! -regex ".*\/(config|logs).*" -print0 | \
  xargs -0 -t -I {} rm -fr {}
  • find 查找./application 下的所有目录,不包括具有/config/logs 的目录,并从最低值开始打印它们
  • xargs 运行删除目录

【讨论】:

    【解决方案3】:

    由于你只是删除application/application/src目录,所以没有理由使用find等。你需要做的就是:

    rm -rf application/application/src
    

    剩余:

    application/application/logs/l2.txt
    application/application/logs/l1.txt
    application/application/config/c1.conf
    application/application/config/c2.conf
    

    【讨论】:

      【解决方案4】:
      cd application
      find . -type d | egrep -v '(^\./$|^\./log|^\./config)' | while read DIR
      do
         echo rm -rf $DIR
      done
      

      这使用 find 列出所有目录,通过 grep 管道排除我们想要保留的目录(也排除将作为 PWD 的“./”),并将过滤后的列表管道传输到执行删除。我已经把“回声”放在那里,这样你就可以测试它是否符合你的实际需要。如果您满意,请删除回声。因为返回的列表(DIR)将按树顺序排列,例如d1、d1/d1a、d1/d1b 和 rm -rf d1 将删除较低的文件夹,您可能需要在 rm -rf 周围添加“if [-d $DIR]”。

      【讨论】:

      • 糟糕,为时已晚,我的回答与 skwilsp 的回答相同。他进来了,而我正在写我的。不过我认为他的更简洁。
      • 永远不要在 bash 中使用大写的变量,为系统变量保留那些颠倒的变量。
      【解决方案5】:

      使用 Bash:

      for file in applications/*; do
          target="${file#*/}"
          if [[ $target != config && $target != logs ]]; then
              rm -rf "$file"
          fi
      done
      

      【讨论】:

        【解决方案6】:

        不需要复杂的find 命令,只需使用shell(假设你在应用程序文件夹中):

        rm -r !(logs|config)
        

        这被称为“路径名扩展”,来自man bash

                 !(pattern-list)
                        Matches anything except one of the given patterns
        

        【讨论】:

          猜你喜欢
          • 2012-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多