我需要创建一个清除脚本以从特定目录列表中删除任何外部目录。
我的想法是做这样的事情:
#!/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 {} +