删除所有其他未定义的目录

删除所有其他未定义的目录

我需要创建一个清除脚本以从特定目录列表中删除任何外部目录。

我的想法是做这样的事情:

 #!/bin/ksh find /data/${USER}/SAS/ -type d ! -name 'SE' | find /data/${USER}/SAS/ -type d ! -name 'Rejet' | find /data/${USER}/SAS/ -type d ! -name 'Acq' | find /data/${USER}/SAS/ -type d ! -name 'Archiv' | find /data/${USER}/SAS/ -type d ! -name 'Cloture' | find /data/${USER}/SAS/ -type d ! -name 'Emis' | find /data/${USER}/SAS/ -type d ! -name 'Ident' | find /data/${USER}/SAS/ -type d ! -name 'Irr*' | find /data/${USER}/SAS/ -type d ! -name 'Recep*'

然后-type f -exec rm {} \;但真的不知道该怎么做。

答案1

要删除路径中/data/${USER}/SAS/除预定义/指定列表中的文件夹之外的所有文件夹 - 使用以下优化find方法:

find /data/${USER}/SAS/ -type d -regextype posix-egrep \
    ! -regex ".*/(SE|Rejet|Acq|Archiv|Cloture|Emis|Ident|Irr.*|Recep.*)" \
    ! -name "SAS" -exec rm -rf {} \;

答案2

既然您正在使用ksh,那么它应该只是一个问题:

(FIGNORE='@(.|..)'; cd /data/"$USER"/SAS/ && 
   echo rm -rf -- !(SE|Rejet|Acq|Archiv|Cloture|Emis|Ident|Irr*|Recep*)/)

echo(高兴时删除)

这将删除除与该列表匹配的目录之外的所有目录(保留非目录文件)。

FIGNORE如果您不想删除隐藏目录,请删除该部分。

请注意,它还会考虑到目录的符号链接(并且根据实现,rm删除符号链接或内容的目标)。

有了find,你会这样做:

cd /data/"$USER"/SAS &&
  find . ! -name . -prune \
    ! -name SE \
    ! -name Reject \
    ! -name Acq \
    ! -name Archiv \
    ! -name Cloture \
    ! -name Emis \
    ! -name Ident \
    ! -name 'Irr*' \
    ! -name 'Recep*' -type d -exec echo rm -rf {} +

相关内容