如何从文件夹中删除除少数文件夹以外的所有文件/文件夹?

时间:2014-08-08 07:10:09

标签: bash ubuntu rm delete-directory

我正在尝试为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/ dir的父级(即,我可以在application中看到PWD

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

6 个答案:

答案 0 :(得分:1)

根据我收集的信息,除了src之外还有其他一些文件夹,否则你只会使用rm -rf src

如果您的PWDapplication,即您位于config logssrc的父目录中,则只需要一种方法即可使用对rm -rfconfig以外的所有文件/文件夹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

答案 1 :(得分:1)

这必须有效:

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正在删除目录

答案 2 :(得分:0)

由于您只是删除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

答案 3 :(得分:0)

cd application
find . -type d | egrep -v '(^\./$|^\./log|^\./config)' | while read DIR
do
   echo rm -rf $DIR
done

这使用find来列出所有目录,通过grep管道来排除我们想要保留的目录(也排除“./”,这将是PWD),并使用过滤列表到while循环的管道删除。我已经把“回声”放在那里,所以你可以测试这是否符合你的实际需要。如果你很高兴那么删除回声。返回列表(DIR)将按树顺序,例如, d1,d1 / d1a,d1 / d1b和rm -rf d1将删除较低的文件夹,您可能希望在rm -rf周围添加“if [-d $ DIR]”。

答案 4 :(得分:0)

使用Bash:

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

答案 5 :(得分:0)

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

rm -r !(logs|config)

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

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