入力ファイルからトークンを読み取って言及したファイルを削除する方法

入力ファイルからトークンを読み取って言及したファイルを削除する方法

フォルダと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再帰検索に加えて、2つの違いは、コマンドがワイルドカードパターンのように使用されること$prefixです。find

*withを使用するときは、findシェルが現在のディレクトリの名前と一致するように拡張しないように引用する*必要があります。引用しない上記の最初のループでwithを使用すると、rmシェルはそれを一致するすべての名前に展開します。

もしあなたならいいえ再帰的に削除を実行したいが、生成されたパターンに一致するファイルが多すぎるため、最初のループで「引数リストが長すぎます」というエラーが発生します。これにより、追加の内部ループを実行する必要があります。

#!/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

関連情報