Bash循环遍历变量(带模式的文件夹名称)

时间:2017-02-13 00:32:28

标签: bash

我有一个小的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命令来执行此操作 - 我想学习如何循环。

4 个答案:

答案 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
相关问题