我有一个小的bash脚本,它遍历一些目录并删除其中的内容,如下所示:
#!/bin/bash
echo "Start job at: $(date)"
rm -rf /my/location/log_folder1/*
exit 0
不幸的是,我从1开始有log_folder
- > 10.所以,log_folder1,log_folder2,log_folder3等..
如何有效地循环使用它而不是为每个rm
写一个单独的行?
我不想使用find
命令来执行此操作 - 我想学习如何循环。
答案 0 :(得分:3)
你可以用括号扩展来做到这一点:
rm -rf /my/location/log_folder{1..10}/*
有关详细信息,请参阅man bash - Brace Expansion。
Brace扩展示例:
$ echo "asd"{1..10}
asd1 asd2 asd3 asd4 asd5 asd6 asd7 asd8 asd9 asd10
答案 1 :(得分:1)
使用查找
find log_folder* -delete
答案 2 :(得分:1)
假设:
$ find . -type d
.
./log_folder1
./log_folder1/sub_log_folder1
./log_folder1/sub_log_folder2
./log_folder1/sub_log_folder3
./log_folder10
./log_folder2
./log_folder3
./log_folder4
./log_folder5
./log_folder6
./log_folder7
./log_folder8
./log_folder9
使用文件名扩展名(a 'glob')和for loop:
$ for fn in log_folder*/*; do
> rm -rf "$fn"
> done
导致:
$ find . -type d
.
./log_folder1
./log_folder10
./log_folder2
./log_folder3
./log_folder4
./log_folder5
./log_folder6
./log_folder7
./log_folder8
./log_folder9
请确保在"$fn"
中使用文件名周围的引号,这样您实际上就会删除您的想法,而不是单词拆分的意外结果。
或者,你可以使用一个以子目录为目标的glob:
$ rm -rf log_folder*/*
或者,仅针对某些子目录的扩展,而不是全部:
$ rm -rf log_folder{1..5}/*
也可以在for
循环中使用。
(如果您刚刚开始使用脚本和扩展,我建议小心rm -rf ....
。也许可以练习一些更可逆的东西......)
答案 3 :(得分:1)
你可以使用这个循环:
# using a common base directory makes it a little safer with 'rm -rf'
fbase=/my/location/log_folder
for n in {1..10}; do
f="$fbase$n"
echo "Cleaning up folder $f"
rm -rf "$f"/* # this will empty everything under $f, but not $f itself will remain as an empty folder
# use 'rm -rf "$f"' to remove everything including the top folder
done