首頁>Linux>source

以下命令以遞迴方式删除除 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。

您能建議吗?

最新回復
  • 5月前
    1 #

    使用 -type f時 你在告诉 find 仅考虑檔案,不考虑其他任何內容.因此,通常不删除目錄是正常的.為了避免删除 /tmp/CURRENT/ 本身,您可以尝試一些操作:

    如果您是 find 支援 -mindepth (GNU find -Linux系統上的預設設置-具有此功能,我不知道其他 find 版本可能会支援它),您可以告诉它仅向下看至少一層:

    find /tmp/CURRENT/  ! -name '104.tar' -mindepth 1
    

    使用第二个 ! 運算符排除它:

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

    只需使用 -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/CURRENT中的所有內容, 除了 /tmp/CURRENT/104.tar ,您不需要 find 完全没有 您可以在bash中執行它:

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

  • bash:如何通過使用sed在檔案的開頭附加儲存在shell變數中的文字?
  • data recovery:通過額外的硬鏈接對重命名的崩潰保證是什麼?