如何从文件夹中删除除少数文件夹以外的所有文件/文件夹?
假设我有一个目录结构如下:
application │ ├── config │ ├── c1.conf │ └── c2.conf │ ├── logs │ ├── l1.txt │ └── l2.txt │ └── src ├── static ├── s1.py └── s2.py
现在我想删除除config
和logs
之外的所有文件夹(在这种情况下,只有src
)。 我的PWD
目前是appliaction/
dir的父母(即我可以在我的PWD
看到application
)。
我应该使用什么命令? (我尝试使用rm -rf
的一些选项,但错误地删除了其他文件,所以我想在尝试其他任何事情之前知道正确的答案!)
尝试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 {} \;
最后删除目录,即使它不是空的。
这种方式比其他一些可能的解决方案要多一些,但是当我删除文件时,我希望能够仔细检查永远消失的内容。 以下步骤假设您可以在您的PWD中看到“申请”,如您的问题中所述。
首先创建一个新的文本文件,其中包含要保留(不删除)的每个文件夹的名称,每行一个文件夹。 将其保存为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
如果你不关心检查txt文件的内容,你可以简单地将上面的命令复制并粘贴到rm-exclude.sh
的末尾,这样运行脚本就可以完成所有操作,只要你必须to-keep.txt
已经填写完毕。 最终结果应该是不删除to-keep.txt
中application
每个直接子文件夹及其内容。
根据Jos的回答 ,我使用它来删除当前目录中的所有文件和目录,但.git
目录除外。
sudo find /home/jeffy/django_files/djauth_lifecycle_tutorial/part_04/ -maxdepth 1 -mindepth 1 -not -name .git -exec rm -rf {} \;
我实际上害怕,并认为这也删除了.git
目录,但我只是忘了使用la
( ls -la
) a
标志。
mindepth
标志是为了避免删除根目录本身。 -maxdepth
防止返回所有子目录和文件,这对f
标志是多余的。
(另外,使用rm -r
时永远不要使用相对路径!)
我将使用我的shell(zsh)进行以下操作(但我认为使用bash是等效的)。
-
类型
echo application/*(/)
并且, 如果没有返回 ,请按TAB键。
-
shell会扩展模式glob; 在这种情况下,
application
中的所有目录的列表; 这条线现在应该是echo application/config application/logs application/src
-
现在我将编辑该行以删除我想要维护的目录。
-
我将三重检查并编辑初始
echo
到rm -rf
。 -
我再次检查……
-
…回击。
无论如何,这种任务(通过手工文件或文件夹选择对他们应用动作)最好用某种视觉辅助来完成,除非你是像我这样的命令行“书呆子”…例如人们真的喜欢午夜指挥官 。