我有示例子目录名称,例如:
- 测试_ABCDEF_406_1
- 测试_ABCDEF_AOH_1
- 测试_ABCDEF_AUQ_1
在一个名为 Test 的较大目录中。
我怎样才能有效地取出“ABCDEF_**_" 或 Test_ 之后的所有内容以获得以下内容:
- ABCDEF_406_1
- ABCDEF_AOH_1
- ABCDEF_AUQ_1
请注意,如果有区别的话,上面是文件夹而不是文件。
答案1
您迭代子目录的路径名并使用参数替换来删除它们的初始部分:
#!/bin/sh
for dirpath in Test/Test_*/; do
# Because of the pattern used above, we know that
# "$dirpath" starts with the string "Test/Test_",
# and this means we know we can delete that:
# But first delete that trailing /
dirpath=${dirpath%/}
shortname=${dirpath#Test/Test_}
printf 'The shortened name for "%s" is "%s"\n' "$dirpath" "$shortname"
done
替换是标准替换,将从中${variable#pattern}
删除(最短)匹配pattern
开始的值$variable
。
同样,${variable%pattern}
,用于删除/
代码中的尾随,删除 的最短匹配pattern
项结尾的值$variable
。
在以下目录树上进行测试:
.
`-- Test/
|-- Test_ABCDEF_406_1/
|-- Test_ABCDEF_AOH_1/
`-- Test_ABCDEF_AUQ_1/
该代码会产生
The shortened name for "Test/Test_ABCDEF_406_1" is "ABCDEF_406_1"
The shortened name for "Test/Test_ABCDEF_AOH_1" is "ABCDEF_AOH_1"
The shortened name for "Test/Test_ABCDEF_AUQ_1" is "ABCDEF_AUQ_1"