我正在建立一個使用包含資料夾和 File_Prefix 的配置刪除檔案的腳本。
這將是設定檔:
config.txt
/local/FolderA,App /local/FolderB,Log /local/FolderC,File
這是我的腳本:
file="local/config.txt" while IFS="," read -r folder prefix; do find %s -name %s* -type f -exec rm {} \ "$folder" "$prefix"; done < "$file"
但是它無法正常工作。您能幫忙解決問題嗎?我在從命令分配值時遇到麻煩IFS
。
答案1
假設您的設定檔不包含嵌入換行符或逗號的字段,並假設您只想刪除指定目錄中具有上述檔案名稱前綴的所有檔案(即不遞歸):
#!/bin/sh
while IFS=, read -r directory prefix; do
rm -- "$directory/$prefix"*
done <config.txt
這會將每行上的第一個逗號分隔欄位讀入directory
變量,並將行的其餘部分讀入prefix
變數。然後它使用這些來刪除文件。 (看「--」(雙破折號)參數記錄在哪裡?有關的解釋--
)
如果您需要在每個提到的目錄路徑下遞歸地進行刪除:
#!/bin/sh
while IFS=, read -r directory prefix; do
find "$directory" -name "$prefix*" -exec rm {} +
done <config.txt
find
除了遞歸搜尋之外,這兩者之間的區別在於$prefix
,它將像find
命令中的通配模式一樣使用。
請注意,*
使用 with 時需要加引號,find
以便 shell 不會將其擴展為匹配當前目錄中的名稱,並且*
應該是未引用的當在上面的第一個循環中使用 with 時rm
,shell 將其擴展到所有符合的名稱。
如果你不想要遞歸地進行刪除,但是您有太多與生成的模式匹配的文件,因此第一個循環會給您一個“參數列表太長”錯誤,那麼您可能需要執行一個額外的內部循環,
#!/bin/sh
while IFS=, read -r directory prefix; do
for pathname in "$directory/$prefix"*; do
rm -- "$pathname"
done
done <config.txt
或使用find
僅限於頂級搜尋路徑,
#!/bin/sh
while IFS=, read -r directory prefix; do
find "$directory" ! -path "$directory" -prune -name "$prefix*" -exec rm {} +
done <config.txt
答案2
我們使用 xargs 將檔案路徑從 config.txt 檔案傳遞到命令列中的 sh 執行檔。
< config.txt xargs -rd'\n' sh -c '
for arg do
find "${arg%,*}" \
-name "${arg##*,}*" \
-type f \
-exec rm -f {} + ;
done
' xargs-sh