假设我有一个如下的目录结构:
application
│
├── config
│ ├── c1.conf
│ └── c2.conf
│
├── logs
│ ├── l1.txt
│ └── l2.txt
│
└── src
├── static
├── s1.py
└── s2.py
现在我想删除除config
和 之外的所有文件夹logs
(在本例中仅src
)。myPWD
当前是 dir 的父级appliaction/
(即我可以application
在我的 中看到PWD
)。
我应该使用什么命令?(我尝试了rm -rf
一些选项但错误地删除了其他文件,所以在尝试其他任何操作之前我想知道正确的答案!)
答案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
这种方法比其他一些可能的解决方案要麻烦一些,但当我删除文件时,我希望能够仔细检查哪些文件会永远消失。以下步骤假设您可以在 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 到“应用程序”文件夹的路径。在您的示例中,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
填写,运行脚本就可以完成所有操作。最终结果应该是application
not in的每个直接子文件夹to-keep.txt
及其内容都将被删除。
答案3
基于Jos 的回答,我用这个只删除当前目录中除目录之外的所有文件和目录.git
。
sudo find /home/jeffy/django_files/djauth_lifecycle_tutorial/part_04/ -maxdepth 1 -mindepth 1 -not -name .git -exec rm -rf {} \;
我实际上很害怕并且认为这.git
也删除了目录,但我只是忘了使用a
带有la
( ls -la
) 的标志。
该mindepth
标志是为了避免删除根目录本身。这-maxdepth
将阻止返回所有子目录和文件,这些子目录和文件与该f
标志是多余的。
(此外,使用时切勿使用相对路径rm -r
!)
答案4
我将用我的 shell (zsh) 执行下列操作(但我认为用 bash 可以执行相同的操作)。
类型
echo application/*(/)
和,无需点击回车, 按TAB。
shell 将扩展模式 glob;在本例中,是以下所有目录的列表
application
;该行现在应该是echo application/config application/logs application/src
现在我要编辑该行以删除我想要维护的目录。
我再三检查并编辑了首
echo
字母rm -rf
。我再次检查并且...
...点击回车。
无论如何,这种任务(手动选择文件或文件夹以对其应用操作)最好通过某种视觉辅助来完成,除非你像我一样是一个命令行“书呆子”……例如人们非常喜欢午夜指挥官。