我有两个包含文件号的数组,我需要读取这两个数组并删除这些文件。我需要读取数组并删除目录pri
内的文件。/primary
同样,我需要读取snd
数组并删除/secondary
目录内的文件。这两个目录还有很多其他文件和其他子目录,所以我需要非常小心。我只需要删除这两个数组中提到的文件。
所有文件名都是这样的:
abc_monthly_5_log.data
abc_monthly_25_log.data
abc_monthly_78_log.data
下面是我的脚本,我可以迭代它们并一一删除这些文件。还有其他更好的方法吗?
# 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
一次。
我上面编写的方式假设所有路径组件都不包含文字换行符或空格(在本例中它们不这样做)。