Shell-Script

除了作為參數傳遞的某些特定文件之外,如何刪除文件?

  • May 16, 2019

任務是編寫一個帶有 n+1 個參數的 shell 腳本,其中第一個是目錄,其餘的是指定的文件,並將刪除除指定文件之外的所有文件。

例如呼叫rmexcept . '*.jpg' '*.png'

cd $1
for i in “${@:2}”
do 
find . -type f -not -name $i -delete
done 

這是我的嘗試。但是,它僅適用於 1 個指定文件(例如rmexcept . '*.jpg')。如果有超過 1 個文件(例如rmexcept . '*.jpg' '*.png'),則刪除所有文件。我不知道出了什麼問題,因為我相信我已經創建了一個 for 循環。

試試這個(內聯評論):

#!/bin/bash                                                                     
set -f     # Prevent e.g. *.txt from being expanded here

dir=$1     # Get the target directory and
shift      # remove from list of args

cmd="find $dir -type f"
while (( "$#" ))              # While there are more arguments left
do
   cmd="$cmd -not -name $1"  # add to not match
   shift                     # and remove from list of arguments
done
cmd="$cmd -exec rm -i {} ;"   # finally execute rm on the remaining matches

echo $cmd  # Print the final find command
$cmd       # And execute it

我添加-i了它,rm以便在刪除每個文件之前詢問它。但是你當然可以調整它。

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