현재 디렉토리 쉘 스크립트에서 다른 이름의 파일 복사

현재 디렉토리 쉘 스크립트에서 다른 이름의 파일 복사

내 배쉬 스크립트

echo -n "Round Name:"
read round
mkdir $round

echo -n "File Names:"
read $1 $2 $3 $4 $5 $6
cp ~/Documents/Library/Template.py $1.py $2.py $3.py $4.py $5.py $6.py .

디렉터리에 대한 자동화가 있고 파일 이름에 대해서도 동일한 자동화를 원합니다.

알 수 없는 입력을 받은 후 이 작업을 수행하려면 쉘 스크립트를 어떻게 얻나요?
cp ~/Documents/Library/Template.py A.py B.py C.py D1.py D2.py $round/.

답변1

다양한 문자열을 대화형으로 읽는 대신 사용자가 스크립트의 명령줄에서 전달하도록 하세요.

아래 스크립트가 호출됩니다.

./script -d dirname -t templatefile -- string1 string2 string3 string4

dirname...아직 존재하지 않는 경우 생성된 다음 templatefile문자열에 지정된 루트 이름을 사용하여 디렉터리에 복사됩니다. 템플릿 파일에 파일 이름 접미사가 있는 경우 각 문자열 끝에 추가되어 새 파일 이름을 만듭니다(기존 접미사의 중복을 피하기 위해 문자열에서 접미사를 제거한 후).

옵션을 사용하면 스크립트에서 디렉터리 생성 단계를 무시할 수 있습니다 -n. 이 경우 스크립트는 지정된 디렉터리가 -d이미 존재한다고 가정합니다.

#!/bin/sh

# Unset strings set via options.
unset -v dirpath do_mkdir templatepath

# Do command line parsing for -d and -t options.
while getopts d:nt: opt; do
    case $opt in
        d)
            dirpath=$OPTARG
            ;;
        n)
            do_mkdir=false
            ;;
        t)
            templatepath=$OPTARG
            ;;
        *)
            echo 'Error in command line parsing' >&2
            exit 1
    esac
done

shift "$((OPTIND - 1))"

# Sanity checks.
: "${dirpath:?Missing directory path (-d)}"
: "${templatepath:?Missing template file path (-t)}"

if [ ! -f "$templatepath" ]; then
    printf 'Can not find template file "%s"\n' "$templatepath" >&2
    exit 1
fi

if "${do_mkdir-true}"; then
    # Create destination directory.
    mkdir -p -- "$dirpath" || exit
fi
if [ ! -d "$dirpath" ]; then
    printf 'Directory "%s" does not exist\n' "$dirpath" >&2
    exit 1
fi

# Check to see whether the template file has a filename suffix.
# If so, save the suffix in $suffix.
suffix=${templatepath##*.}
if [ "$suffix" = "$templatepath" ]; then
    # No filename suffix.
    suffix=''
else
    # Has filename suffix.
    suffix=.$suffix
fi

# Do copying.
for string do
    # Remove the suffix from the string,
    # if the string ends with the suffix.
    string=${string%$suffix}
    cp -- "$templatepath" "$dirpath/$string$suffix"
done

질문 끝에 있는 예제를 다시 생성하려면 다음과 같이 이 스크립트를 사용할 수 있습니다.

./script -t ~/Documents/Library/Template.py -d "$round" -- A B C D1 D2

답변2

#!/bin/bash

echo -n "Round Name:"
read round
mkdir $round

read -r -p "Enter the filenames:" -a arr
for filenames in "${arr[@]}"; do 
cp ~/Documents/Library/Template.py $round/$filenames
done

이는 배열을 통해 수행되므로 무한한 입력을 허용합니다. 다음과 같이 공백으로 구분된 파일 이름을 입력하세요.

Enter the filenames:test1 test2 test3

관련 정보