次の形式のディレクトリがあります。
/folder1/folder2/name_X_Y_Z_A
ここではX
、数字、、、Y
はZ
3A
つまたは4つの文字列です。
次のようにシェルスクリプトファイルを作成したいと思います。
- フォルダ名から
X
合計を抽出します。Z
- 文字列の生成
/folder1/folder2/name_(X-1)_Y_Z_A
string_Z.dat
このディレクトリからファイルをコピーする
ここから特定のパターンを抽出する方法がわかりません$PWD
。数字の長さと長さが異なる可能性があるため、X
およびの文字位置は同じである必要はありません。Z
name
答え1
まず、シェルのパラメータ置換構文を使用して先行パスコンポーネントを切り取ってから、${PWD##*/}
下線をフィールド区切り文字として使用して、デフォルト名を配列として読み取ることができます。
IFS=_ read -a arr <<< "${PWD##*/}"
bash配列はインデックスが0なので、必要な部分を配置する必要があります${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
これを行うもう1つの方法は、最後がどこにあるかを調べ、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