递归删除solaris中除特定文件外的所有文件+文件夹

递归删除solaris中除特定文件外的所有文件+文件夹

以下命令递归删除文件夹104.tar下除文件外的所有内容/tmp/CURRENT

find /tmp/CURRENT/ -type f ! -name '104.tar' -exec rm -rf {} +

但是,它不会递归删除 下的任何子文件夹/tmp/CURRENT

如果我给出-type d它可能会有所帮助,但我不需要单独的命令。我的要求是使用我在下面尝试的相同的单个命令删除文件和文件夹,但它没有帮助。

find /tmp/CURRENT/ -type f -type d ! -name '104.tar' -exec rm -rf {} +

如果我根本不指定-type选项,那么该命令将删除整个/tmp/CURRENT文件夹而不是其内容!

注意:我的操作系统是 Sun Solaris Sparc。

你能建议一下吗?

答案1

当你使用时,-type f你是在find告诉仅有的考虑文件而不是其他。所以这不会删除目录是正常的。为了避免删除/tmp/CURRENT/自身,您可以尝试以下操作:

  1. 如果你find支持-mindepth(GNU find——Linux系统上的默认设置——有这个,我不知道其他find版本可能支持它),你可以告诉它只查看至少一级的内容:

    find /tmp/CURRENT/  ! -name '104.tar' -mindepth 1 
    
  2. 使用第二个!运算符将其排除:

    find /tmp/CURRENT/ ! -path /tmp/CURRENT/ ! -name '104.tar' 
    
  3. 只需使用-path, 并查找以至少一个字符开头/tmp/CURRENT且后跟至少一个字符的路径:

    find /tmp/CURRENT/ -path '/tmp/CURRENT/?*' ! -name '104.tar' 
    

在所有三种情况下,您都可以添加-exec rm -r {} +到命令末尾以删除匹配项。

但请注意,这些命令将删除一切除特定文件外/tmp/CURRENT/104.tar。因此,如果您有子目录中/tmp/CURRENT/dir1/104.tar指定的文件或任何其他文件104.tar,这些文件将被删除。如果这不是您想要的,请编辑您的问题以澄清。

当然,如果您只想删除/tmp/CURRENTexcept中的所有内容,则根本/tmp/CURRENT/104.tar不需要。find你可以在 bash 中运行它:

shopt -s extglob
rm -r /tmp/CURRENT/!(104.tar)

相关内容