Bash;在文件夹编号时检查文件夹是否存在
Bash; check if a folder exist while the folders are numbered
我有一系列文件夹(A1、A2、...)和一些子文件夹,但我只需要检查遵循这种模式的子文件夹 0$n_st*
,我不需要检查其余部分子文件夹数:
A1/
01_stjhs_lkk/
02_stlkd_ooe/
03_stoie_akwe/
...
A2/
01_stpw_awq/
02_stoe_iwoq/
03_stak_weri/
...
...
我想找到数量最多的子文件夹(0$n
)(子文件夹的数量因文件夹而异),然后转到子文件夹和grep
一些东西并重复这个过程其他文件夹(A1、A2、...)这是我的脚本,它不起作用(似乎 if
条件有问题)
for dd in */; do
cd "$dd" # A1, A2,...
for num in {8,7,6,5,4,3,2,1}; do
if [ -d 0${num}_st* ]; then
echo "0${num}_st*"
cd "0${num}_st*"
echo $(grep -i 'xyz f' 04_*.log) #grep this line from log file
break
fi
cd ..
done
cd ..
done
直接的问题是,如果 ...
是匹配多个文件的通配符,if [ -d ... ]
将产生语法错误。您可以通过多种方式解决此问题,但可能符合您(模糊)要求的最简单方法是
for dd in */; do
for dir in "$dd"/0[0-9]_st*/; do
: nothing
done
# the variable `$dir` will now contain the alphabetically last match
grep -i 'xyz f' "$dir"/04_*.log
done
如果目录的名称中包含不同位数的数字,则按字母顺序对它们进行排序将不起作用(2 将排在 19 之后)但是您的示例在所有情况下仅显示具有两位数字的名称,因此让我们假设它具有代表性。
这里有一个变体,展示了使用 sort -n
查找最大数字的不同方法,因此它也适用于具有可变数字位数的目录。
for dd in */; do
biggest=$(printf '%s\n' "$dd"/0*_st*/ | sort -d / -k2,2n | tail -n 1)
grep -i 'xyz f' "$biggest"/04_*.log
done
因为通配符已经以 /
结尾,例如 /
之后"$dd"/
严格来说是多余的,但无害。如果它打扰了你(或者你在一个奇怪的系统上,双斜杠对文件系统有特殊意义),你可以把它去掉(以牺牲一些易读性为代价)。
建议 find
命令。
find . -type d -printf "%f\n" |grep "^0"|sort -n|tail -n1
注意这个查找命令递归扫描当前目录下的所有个目录。
为了将 find
命令限制到特定目录 dir1
dir2
您需要在 -type
选项之前指定它们。
find dir1 dir2 -type d -printf "%f\n" |grep "^0"|sort -n|tail -n1
说明
find . -type d
打印当前目录下的所有目录和子目录
find . -type d -printf "%f\n"
仅打印目录名称,不打印目录路径。
grep "^0"
仅过滤以 0
开头的目录名称
如果匹配的目录多于需要的目录,
也可能优化 grep
过滤器:grep "^0[[:digit:]]\+_"
。
sort -n
按数字对目录名称排序
tail -n1
打印最后一个目录
我有一系列文件夹(A1、A2、...)和一些子文件夹,但我只需要检查遵循这种模式的子文件夹 0$n_st*
,我不需要检查其余部分子文件夹数:
A1/
01_stjhs_lkk/
02_stlkd_ooe/
03_stoie_akwe/
...
A2/
01_stpw_awq/
02_stoe_iwoq/
03_stak_weri/
...
...
我想找到数量最多的子文件夹(0$n
)(子文件夹的数量因文件夹而异),然后转到子文件夹和grep
一些东西并重复这个过程其他文件夹(A1、A2、...)这是我的脚本,它不起作用(似乎 if
条件有问题)
for dd in */; do
cd "$dd" # A1, A2,...
for num in {8,7,6,5,4,3,2,1}; do
if [ -d 0${num}_st* ]; then
echo "0${num}_st*"
cd "0${num}_st*"
echo $(grep -i 'xyz f' 04_*.log) #grep this line from log file
break
fi
cd ..
done
cd ..
done
直接的问题是,如果 ...
是匹配多个文件的通配符,if [ -d ... ]
将产生语法错误。您可以通过多种方式解决此问题,但可能符合您(模糊)要求的最简单方法是
for dd in */; do
for dir in "$dd"/0[0-9]_st*/; do
: nothing
done
# the variable `$dir` will now contain the alphabetically last match
grep -i 'xyz f' "$dir"/04_*.log
done
如果目录的名称中包含不同位数的数字,则按字母顺序对它们进行排序将不起作用(2 将排在 19 之后)但是您的示例在所有情况下仅显示具有两位数字的名称,因此让我们假设它具有代表性。
这里有一个变体,展示了使用 sort -n
查找最大数字的不同方法,因此它也适用于具有可变数字位数的目录。
for dd in */; do
biggest=$(printf '%s\n' "$dd"/0*_st*/ | sort -d / -k2,2n | tail -n 1)
grep -i 'xyz f' "$biggest"/04_*.log
done
因为通配符已经以 /
结尾,例如 /
之后"$dd"/
严格来说是多余的,但无害。如果它打扰了你(或者你在一个奇怪的系统上,双斜杠对文件系统有特殊意义),你可以把它去掉(以牺牲一些易读性为代价)。
建议 find
命令。
find . -type d -printf "%f\n" |grep "^0"|sort -n|tail -n1
注意这个查找命令递归扫描当前目录下的所有个目录。
为了将 find
命令限制到特定目录 dir1
dir2
您需要在 -type
选项之前指定它们。
find dir1 dir2 -type d -printf "%f\n" |grep "^0"|sort -n|tail -n1
说明
find . -type d
打印当前目录下的所有目录和子目录find . -type d -printf "%f\n"
仅打印目录名称,不打印目录路径。
开头的目录名称grep "^0"
仅过滤以0
如果匹配的目录多于需要的目录, 也可能优化
grep
过滤器:grep "^0[[:digit:]]\+_"
。sort -n
按数字对目录名称排序tail -n1
打印最后一个目录