現在のファイル名:017251004_2301941_5193716.xml
必要な数:5193716
_
.xml
最後の数字の前後の数字を変数に保存する必要があります。誰かが同じ構文を提供できますか?
私はこれを試しましたが、num="${file:19:7}"
400万個のファイルがあり、ある程度動作していたため、一部のファイルをインポートした後にフルネームを取得できませんでした。
現在のコード:
for file in "$origin"/*.xml
do
[ -f "$file" ] || continue # In case there are no files to copy
name=${file%.*} # Strip extension
name=${name##*/} # Strip leading path
save="${name}_$dt.xml" # Backup filename with datetime suffix
num="${file:19:7}"
echo "Copying file from Server A to Server B"
scp -C -- "$file" "$username@$ip:$destination"
done
答え1
はい、次のように簡単です。
#!/bin/bash
# test wrapper
file="017251004_2301941_5193716.xml"
num=$(basename "$file" ".xml" | cut -d_ -f3)
printf "file=$file,num=$num\n"
exit 0
もちろん読んでくださいman basename cut
。
答え2
$file
繰り返し可能なファイルセットのコードはすでにあります。
name=${file%.*} # Strip extension name=${name##*/} # Strip leading path
name
この時点でデバッグ行を挿入すると、拡張子のないファイル名が含まれていることがわかります.xml
。
echo "# file=$file, name=$name #" >&2
たとえば、name=017251004_2301941_5193716
。ここでは、bash
パターンマッチングツールを使用して最後に区切られた要素を抽出するのが簡単です_
。
fieldNum=${name##*_} # Extract last `_`-separated field value
man bash
次のセクションを読むことは時間を費やす価値があると思います。パラメータ拡張${parameter#word}
、特に説明する部分および${parameter%word}
(およびその倍加##
および変形)%%
。スクリプトを必要とせずに、シェルから直接これらのコマンドやその他のバリエーションを使用して実験できます。
f=/path/to/my.file.txt
echo "Strip trailing parts: '${f%/*}' and '${f%.*}' and '${f%%.*}'"
echo "Strip leading parts: '${f#*/}' and '${f##*/}' and '${f##*.}'"