쉘 스크립트를 사용하여 처음 3자가 동일하고 그 뒤에 # 시퀀스가 ​​있는 파일을 나열하십시오.

쉘 스크립트를 사용하여 처음 3자가 동일하고 그 뒤에 # 시퀀스가 ​​있는 파일을 나열하십시오.

여기에 처음 게시합니다. 처음 3개의 문자와 일련 번호가 동일한 디렉터리의 파일을 그룹화하는 방법은 무엇입니까? 예를 들어

VHS-01-001.avi
VHS-01-002.avi
-------------
VHS-02-001.avi
VHS-02-002.avi
VHS-02-003.avi
---------
Hi8-01-001.avi
Hi8-01-002.avi
Hi8-01-003.avi

이렇게 하면 다음과 같이 함수에서 각 비디오 파일 세트를 전달할 수 있습니다.

encode(){
  for avi in "$@" 
  do..
}

답변1

아마도 그다지 스마트한 솔루션은 아닐 수도 있습니다.

  • 이름별로 파일 정렬
  • 이름을 통해 반복
  • 마지막 루프의 문자를 비교하십시오.

    last=""
    ls -1 $1 | sort | while read file; do
        sub=${file:0:3}
        [ "$last" != "$sub" ] && { echo "NEW GROUP"; last="$sub"; }
        echo "[$sub] $file"
    done
    

컬렉션 배열 내부에 파일 이름을 에코하는 대신...

그냥 아이디어입니다... 출력 예:

NEW GROUP                                                                                                                                                                                                                                    
[Hi8] Hi8-01-002.avi                                                                                                                                                                                                                         
NEW GROUP                                                                                                                                                                                                                                    
[VHS] VHS-01-001.avi                                                                                                                                                                                                                         
[VHS] VHS-01-002.avi
[VHS] VHS-02-002.avi
NEW GROUP
[XZU] XZU

편집 1: 기반앤서니 게건대답은 루프 시작 부분에 파이프를 사용하지 않고 bash 와일드카드를 사용하는 것입니다. 그의 댓글을 확인해 보세요.

향상된 스크립트:

last=""
for file in *avi; do
    sub=${file:0:3}
    [ "$last" != "$sub" ] && { echo "NEW GROUP"; last="$sub"; }
    echo "[$sub] $file"
done

편집 2:

@ 님의 요청에 따라토니 첸그의 세 번째 코멘트는 다음과 같습니다. 수집된 파일 이름을 함수로 구문 분석하는 간단한 솔루션을 찾을 수 있습니다. 이를 수행하는 방법에는 여러 가지가 있습니다. 그리고 저는 bash 스크립팅에 대한 경험이 많지 않습니다... ;)

#!/bin/bash

SOURCE_DIR="$1"
cd "$SOURCE_DIR" || { echo "could not read dir '$SOURCE_DIR'"; exit 1; }

function parseFiles() {
  echo "parsing files:"
  echo "$1"
}

last=""
declare -a fileGroup

for file in *avi; do
  # first 3 chars of filename
  sub=${file:0:3}

  if test -z "$last"; then
    # last is empty. first loop
    last="$sub"
  elif test "$last" != "$sub"; then
    # new file group detected, parse collected
    parseFiles "${fileGroup[*]}"
    # reset array
    fileGroup=()
    last="$sub"
  fi

  # append name to array
  fileGroup[${#fileGroup[@]}]=$file
done

parseFiles "${fileGroup[*]}"

답변2

그리고 zsh:

files=(???-??-*.avi)
for prefix (${(Mu)files#???-??-}) encode $prefix*.avi

(또는 encode ${(M)files:#$prefix*})

GNU 셸( bash) 및 해당 도구는 다음과 같습니다.

while IFS= read -u3 -rd '' prefix; do
  encode "$prefix-"*.avi 3<&-
done 3< <(printf '%s\0' ???-??-*.avi | grep -oz '^...-..-' | sort -zu)

같은 원리. 패턴과 일치하는 현재 디렉터리의 파일 목록을 가져오고 ???-??-*.avi일치하는 부분( / )(regexp)을 추출하고 고유한( / ) 다음 해당 접두사 목록을 반복합니다.(M)grep -o???-??-...-..-(u)sort -u

관련 정보