Find

遞歸刪除solaris中除特定文件之外的所有文件+文件夾

  • January 5, 2021

以下命令遞歸刪除文件夾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。

你能建議嗎?

當您使用時,-type f您告訴find考慮文件而不考慮其他任何內容。所以這不會刪除目錄是正常的。為避免/tmp/CURRENT/自行刪除,您可以嘗試以下操作:

  1. 如果你的find支持-mindepth(GNU find——Linux 系統上的預設設置——有這個,我不知道其他find版本可能支持它),你可以告訴它只看至少一層以下的東西:
find /tmp/CURRENT/  ! -name '104.tar' -mindepth 1 
  1. 使用第二個!運算符將其排除:
find /tmp/CURRENT/ ! -path /tmp/CURRENT/ ! -name '104.tar' 
  1. 只需使用-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)

引用自:https://unix.stackexchange.com/questions/627606