我有一个以下格式的目录:
/folder1/folder2/name_X_Y_Z_A
其中X
是数字,Y
、Z
和A
是 3 或 4 个字符长的字符串。
我想编写一个 shell 脚本文件来执行以下操作:
- 从文件夹名称中提取
X
和Z
- 创建字符串
/folder1/folder2/name_(X-1)_Y_Z_A
string_Z.dat
从该目录复制文件
我不知道如何从 中提取特定模式$PWD
。X
和的字符位置Z
不必相同,因为数字长度和 的长度name
可以不同。
答案1
您可以首先使用 shell 的参数替换语法修剪前导路径组件${PWD##*/}
,然后使用下划线作为字段分隔符将基本名称读入数组:
IFS=_ read -a arr <<< "${PWD##*/}"
由于 bash 数组是零索引的,因此您想要的部分应该位于${arr[1]}
例如${arr[3]}
newdir="/folder1/folder2/name_$((${arr[1]}-1))_${arr[3]}_Z_A"
[注意:我假设您指的是算术结果(X-1)
而不是文字字符串。]
答案2
假设 X,Y,Z,A 中没有任何下划线,那么我们每次都可以“剪掉”尾巴
例如
# DIR=$PWD
# example:
DIR=/folder1/folder2/name_100_YYYY_ZZZZ_AAAA
A=${DIR##*_} ; DIR=${DIR%_*}
Z=${DIR##*_} ; DIR=${DIR%_*}
Y=${DIR##*_} ; DIR=${DIR%_*}
X=${DIR##*_} ; DIR=${DIR%_*}
let X=X-1
DIR="${DIR}_${X}_${Y}_${Z}_${A}"
echo $DIR
我们可以做到这一点的另一种方法是找出X
结束位置并一次性剥离其余部分:
# DIR=$PWD
# example:
DIR=/folder1/folder2/name_100_YYYY_ZZZZ_AAAA
DIRX=${DIR%_*_*_*}
YZA=${DIR#$DIRX}
X=${DIRX##*_} ; DIRX=${DIRX%_*}
let X=X-1
DIR="${DIRX}_${X}${YZA}"
echo $DIR
在这两种情况下我们都会得到/folder1/folder2/name_99_YYYY_ZZZZ_AAAA
结果。您可以轻松地将cp
您的文件放入其中。
答案3
如果你可以使用Python:
$ pwd=/folder1/folder1/name_10_ABCD_ABC_ABCD # or use $PWD
$ new=$(python -c "import os; x='"$pwd"'.rsplit('/', 1)[1].split('_'); x[1]=str(int(x[1])+1); print('_'.join(x))")
$ echo $new
name_11_ABCD_ABC_ABCD