ファイル番号を含む2つの配列があり、両方の配列を読み取ってファイルを削除する必要があります。配列を読み、pri
ディレクトリ内のファイルを削除する必要があります。同様に、配列を/primary
読み取ってディレクトリ内のファイルを削除する必要があります。これら2つのディレクトリには他のファイルや他のサブディレクトリがたくさんあるので、非常に注意する必要があります。これら2つの配列に記載されているファイルを削除するだけです。snd
/secondary
すべてのファイル名は次のとおりです。
abc_monthly_5_log.data
abc_monthly_25_log.data
abc_monthly_78_log.data
以下は、ファイルを繰り返してファイルを1つずつ削除できるスクリプトです。他に良い方法がありますか?
# it will lot of file numbers not just four or five files
pri=(0 5 7 100)
snd=(9 8 187 90 156)
# iterate pri array and delete files inside
for pm in "${pri[@]}"; do
rm /primary/abc_monthly_"$pm"_log.data
done
# iterate snd array and delete files inside
for sm in "${snd[@]}"; do
rm /secondary/abc_monthly_"$sm"_log.data
done
答え1
rm
あまり頻繁に実行される「より良い」方法は、次のものを使用することですxargs
。
{
for pm in "${pri[@]}"; do
printf '/primary/abc_monthly_%s_log.data\n' "$pm"
done
for sm in "${snd[@]}"; do
printf '/secondary/abc_monthly_%s_log.data\n' "$sm"
done
} | xargs rm
これは、パス名を生成する手段としてループを使用します。その後、これらのパス名はこのパス名に渡され、できるだけxargs rm
多くのパス名を同時に実行します。rm
提供されたサンプル配列を使用すると、次のことが実行できます。rm
一度。
上記の方法は、パスコンポーネントのどれもリテラルの改行やスペースを含まないと仮定します(この場合は含まれません)。