フォルダと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