删除 UNIX 中不包含特定名称的所有文件夹

删除 UNIX 中不包含特定名称的所有文件夹

我正在尝试弄清楚我在 *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

相关内容