所以我想在开始工作之前清理一个目录。我看起来有点像这个。
./static
├── css
│ └── styles
├── img
│ └── pictures
└── js
└── scripts
我想要和rm
的内容,但不想要。css
js
img
我知道我可以把两条路径都放进去,但这让我很烦恼,所以我尝试了这个,但没有成功。
rm -r ./static/{css,js}/*
rm: 无法删除 './static/{css,js}/*': 没有这样的文件或目录
我有什么想法可以让这项工作成功吗?
答案1
您的命令被视为*
文件,请尝试rm -rf ./static/{css,js}/
或者,Bash 有扩展的通配符(先测试,然后删除echo
):
$ shopt -s extglob
$ cd static
$ echo rm -rf !(img)
或者 简答
ls | grep -v "img" | xargs rm -rf
正如OP在评论中建议的那样,请按照此步骤完成您的工作。首先通过打印文件进行试运行,以确保您获得所需的内容。
$ find . -path ./img -prune -o -type f
./css/styles
./img
./js/scripts
确认无误后删除。
$ find . -path ./img -prune -o -type f -exec rm {} \;
$ static/
├── css
├── img
│ └── pictures
└── js
答案2
它有点长,但我总是喜欢find
当我想要具体时。这应该保留结构并忽略 img 目录。
find ./static -type d ! -name 'img' -exec rm -f {}/* \;
正在发生的事情的细分
find
命令
./static
指定搜索位置
type -d
挑选出目录
! -name 'img'
忽略 img 目录
-exec rm -f {}/* \:
'{}
被替换为找到的目录名称并执行该命令。