如何從輸入文件讀取令牌以刪除其中提到的文件

如何從輸入文件讀取令牌以刪除其中提到的文件

我正在建立一個使用包含資料夾和 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

相關內容