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를 생성합니다.