我正在尝试弄清楚我在 *nix 方面的旧技能。
我想要实现的是删除所有不包含特定单词的文件夹。
这是清单
➜ myfolder: pwd
/user/myfolder
➜ myfolder: ll locale
drwxr-xr-x 3 user staff 102 23 Oct 11:13 bn_BD
drwxr-xr-x 3 user staff 102 23 Oct 11:13 bn_IN
drwxr-xr-x 3 user staff 102 22 Oct 19:03 en_CA
drwxr-xr-x 8 user staff 272 9 Dec 16:10 en_US
drwxr-xr-x 3 user staff 102 22 Oct 19:03 es
drwxr-xr-x 3 user staff 102 21 Oct 13:18 fr
drwxr-xr-x 3 user staff 102 23 Oct 11:13 pt
drwxr-xr-x 3 user staff 102 21 Oct 13:18 ru
drwxr-xr-x 3 user staff 102 21 Oct 13:18 th_TH
现在我想删除除英文
我不知道命令中的 not 是什么
rm -rf locale/[!somethinghere]
答案1
使用 GNU find(可能还有其他版本),你可以使用感叹号来反向搜索——这样就可以找到并删除当前目录中的所有内容除了‘en_us’:
find . ! -name 'en_US' -delete
## If you only want to delete directories:
find . -type d ! -name 'en_US' -delete
## If you *don't* want recursiveness:
find . -maxdepth 1 -type d ! -name 'en_US' -delete
## If you want to avoid deleting dotfiles:
find . -maxdepth 1 -type d ! -name 'en_US' -a ! '.*' -delete
有些版本find
没有该-delete
选项;你可以使用以下选项之一:
find . -maxdepth 1 -type d ! -name 'en_US' -exec rm -r '{}' +
find . -maxdepth 1 -type d ! -name 'en_US' -a ! '.*' -exec rm -r '{}' +
或者,由于您在评论中提到您有 zsh,
setopt extendedglob ## this may already be set in you .zshrc
rm ^*en_US*
## If you only want to delete directories:
rm ^*en_US*(/)
答案2
三行解决方案即可起作用(已使用 Linux bash 测试):
tar cvf foo $(find locale -name en_US)
rm -fr locale
tar xvf foo
那是:
- 保存您想保留的内容
- 删除原件
- 恢复您保存的内容
我尝试过类似的东西find locale \( -name en_US -true \) -o -print | xargs ...
,但这似乎更复杂。而且如果一个人的 Unix 技能生疏了,风险也更大。
答案3
这就是我最终要做的事情。
find locale -type d ! -name 'en_US' ! -name 'locale' | xargs rm -rf
我必须同时包含“语言环境”的原因是因为xargs
返回locale locale/bn_BD locale/bn_IN locale/en_CA locale/es locale/fr locale/pt locale/ru locale/th_TH
现在我已删除这些
# deleted: locale/bn_BD/goggles.webmaker.org.json
# deleted: locale/bn_IN/goggles.webmaker.org.json
# deleted: locale/en_CA/goggles.webmaker.org.json
# deleted: locale/es/goggles.webmaker.org.json
# deleted: locale/fr/goggles.webmaker.org.json
# deleted: locale/pt/goggles.webmaker.org.json
# deleted: locale/ru/goggles.webmaker.org.json
# deleted: locale/th_TH/goggles.webmaker.org.json
答案4
您可以使用 bash 扩展来完成此操作:
rm -rf path/to/!(something.*)
编辑:
正如下面的评论中提到的,此命令有效,如果扩展通配符格式已启用。
您可以通过命令启用shopt -s extglob
它狂欢或setopt kshglob
嘚。