각 파일에 인덱스를 삽입하면서 파일을 여러 번 복사하는 방법

각 파일에 인덱스를 삽입하면서 파일을 여러 번 복사하는 방법

ascdrgi.txt다음 내용이 포함된 파일이 있습니다 .

tiger
lion
cat

파일 이름의 마지막 문자를 변경하여(확장자 무시) 이 파일을 (가변) 횟수만큼 반복하고 싶습니다. 예를 들어, 이 경우 3개의 복사본을 만들면 이름은 다음과 같습니다.

  • ascdrgj.txt
  • ascdrgk.txt
  • ascdrgl.txt

파일 이름이 숫자로 끝나면 해당 숫자가 증가해야 하므로 복사본은 ascdrg1.txt다음과 같습니다.

  • ascdrg2.txt
  • ascdrg3.txt
  • ascdrg4.txt

파일이 이미 존재하는 경우 스크립트는 해당 이름을 건너뛰고 다음 이름으로 이동해야 합니다. 마지막 문자( , 또는 )에 도달하면 z처음 Z으로 9반복되어야 합니다(다음 문자는 각각 a, A또는 입니다 1).

원본 파일을 복사하는 것 외에도 각 파일의 첫 번째 줄을 수정하여 해당 파일이 무엇인지(숫자)와 총 파일 수를 알려야 합니다. 첫 번째 ascdrgi.txt예를 사용하면 이제 파일에 다음이 포함됩니다.

tiger number(1,4)
lion
cat

다음 파일에는 다음이 ascdrgj.txt포함됩니다.

tiger number(2,4)
lion
cat

등.

답변1

다음 쉘 스크립트는 필요한 대부분의 작업을 수행합니다. 원본 파일은 수정되지 않으며("번호"가 추가되지 않음) 새로 생성된 파일만 수정됩니다.

의견이 충분히 명확하기를 바랍니다. bash의 인수 확장 대신 다소 복잡한 접근 방식을 사용하면 expr이식성이 더 높아집니다.

#!/bin/sh

orig=ascdrg3.txt # start with this file

in=$orig
count=1 #loop variable
max=5   #number of files to create
while test "$count" -le "$max" ; do
    # Remove extension
    base=$(basename "$in" .txt)

    # get the prefix
    prefix=$(expr substr "$base" 1 $((${#base}-1)))

    # get last letter
    last=$(expr substr "$base" ${#base} 1)

    while true ;
    do
        # Advance letter, while the file doesn't exist
        last=$(echo "$last" | tr A-Z B-ZA)
        last=$(echo "$last" | tr a-z b-za)
        last=$(echo "$last" | tr 0-9 1-90)

        # construct new file name
        new="$prefix$last.txt"

        # continue if it doesn't exist
        # (otherwise, advance the last letter and try again)
        test -e "$new" || break

        test "$new" = "$orig" \
            && { echo "error: looped back to original file" >&2 ; exit 1; }
    done


    # Create new file
    cp "$orig" "$new"

    # Modify first line of new file
    sed -i "1s/\$/number($count,$max)/" "$new"

    # Advance counter
    count=$((count+1))

    # loop again
    in=$new
done

답변2

숫자 대소문자: ab1.txt와 같고 ab2.txt 및 ab3.txt 등을 원하는 경우:

  for i in `seq 2 3` ; do cp ab1 ab$i.txt ; done

대문자와 소문자를 사용하여 비슷한 작업을 수행할 수 있습니다.

   for i in `echo {d..f}` ; do cp abc.txt ab$i.txt ; done

abd.txt abe.txt abf.txt를 생성합니다.

관련 정보