Linux Shell에서 파일 이름의 일부를 변수로 저장

Linux Shell에서 파일 이름의 일부를 변수로 저장

현재 파일 이름: 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##*.}'"

관련 정보