rm如何删除文件夹中的所有文件/文件夹,但排除一些文件夹?

分享于 

3分钟阅读

ubuntu

  繁體

问题

假设我有一个目录结构,如下所示:


application


│


├── config


│ ├── c1.conf


│ └── c2.conf


│


├── logs


│ ├── l1.txt


│ └── l2.txt


│


└── src


 ├── static


 ├── s1.py


 └── s2.py



现在想删除除configlogs之外的所有文件夹,

我应该使用什么命令?


答案1

试试find ./application/ -type d -not -name config -not -name logs

如果返回正确的目录,运行

find ./application/ -type d -not -name config -not -name logs -exec rm -R {} ;

exec rm -R {} ; 即使目录不为空,也会删除它。


答案2

首先创建一个新的文本文件,其中包含要保留(不删除)的每个文件夹的名称,每行一个文件夹,将它保存为to-keep.txt例如:

 
config


logs



然后,将以下内容复制到文本编辑器中,并将它保存为rm-exclude.sh,以便所有三个文件都在同一目录中。


#!/usr/bin/env bash



find"./$1" -maxdepth 1 -type d ! -path"./$1" > to-delete.txt



dels=`cat to-delete.txt`


readarray -t keeps < to-keep.txt



for keep in"${keeps[@]}"; do


 dels=`echo"$dels" | grep -v"$keep"`


done



echo"$dels" > to-delete.txt



使它可执行使用:

chmod +x rm-exclude.sh

然后使用以下命令运行它,其中PATH是PWD中"application"文件夹的路径,在你的例子中,PATH仅仅是application

./rm-exclude.sh PATH

最后,检查to-delete.txt以确保没有删除不应该被删除的内容,并运行:

readarray -t dels < to-delete.txt; for del in"${dels[@]}"; do rm -rf"$del"; done


答案3

sudo find /home/jeffy/django_files/djauth_lifecycle_tutorial/part_04/ -maxdepth 1 -mindepth 1 -not -name .git -exec rm -rf {} ;

mindepth标志是为了避免删除root目录本身,-maxdepth防止返回所有子目录和文件,这与f标志冗余。


答案4


echo application/*(/) 



然后,不按回车键,按TAB。

shell将扩展模式glob;在本例中,application下所有目录的列表;


echo application/config application/logs application/src




文件  files  DEL  FOLD  删除文件