파일을 n번 복사한 다음 .zshrc에 함수를 만드는 방법은 무엇입니까?

파일을 n번 복사한 다음 .zshrc에 함수를 만드는 방법은 무엇입니까?

중복일 수 있습니다.명령 셸에서 파일을 x번 반복합니다.그리고 확실히 중복이야각 파일에 인덱스를 삽입하면서 파일을 여러 번 복사하는 방법하지만 답변을 게시한 사람은 2017년에 마지막으로 목격되었으며 아래와 같이 확장명이 있는 파일(txt 파일뿐만 아니라)에서 호출할 수 있도록 zsh에서 함수로 사용하는 방법을 알고 싶습니다. 번호는 cpx file.ext n어디에 있습니까? n만들 수 있는 사본의 수입니다. 또한 파일 이름과 파일 확장자를 어떻게 분리합니까?

이것은 txt 파일에 대한 답변입니다.

#!/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

이를 수행하는 더 작은 방법이 있습니까?

내가 원하는 것은: cpx hello.py 3만들어야 한다는 것 입니다hello1.py hello2.py hello3.py

답변1

zsh에서 이를 강력하게 수행하는 더 쉬운 방법이 있어야 합니다. 일반 sh에서 이 작업을 강력하게 수행하는 더 쉬운 방법이 있습니다. 이 스크립트는 지나치게 복잡하고 취약합니다(모든 파일 이름에 확장자가 있고 메시지를 표시하지 않고 파일을 덮어쓴다고 가정합니다...). 이번 주제는 zsh에 관한 것이므로 zsh의 기능을 활용하겠습니다.

이것기록 및 매개변수 확장 수정자 re기본 이름과 확장자 간에 파일 이름을 분할하는 데 사용됩니다 . 단, 파일에서만 사용 가능하니 주의하세요.하다확장 기능이 있습니다.

경고: 테스트되지 않은 코드입니다.

function cpx {
  if (($# != 2)); then
    cat >&2 <<EOF
Usage: cpx FILENAME N
Make N copies of FILENAME.
EOF
    return 1
  fi
  local n=$2
  if [[ $n != <-> ]]; then
    print -ru2 "cpx: $n: not a number"
    return 1
  fi
  local prefix=$1 suffix= i
  # If there is an extension, put the number before the extension
  if [[ $prefix:t == ?*.* ]]; then
    prefix=$1:r
    suffix=.$1:e
  fi
  # If the part before the number ends with a digit, separate the additional
  # number with a dash.
  if [[ $prefix == *[0-9] ]]; then
    prefix+="-"
  fi
  # Copy foo.bar to foo1.bar, foo2.bar, ...
  for ((i=1; i<=n; i++)); do
    cp -p -i -- $1 $prefix$i$suffix
  done
}

관련 정보