내 배쉬 스크립트
#!/bin/bash
read -r -p "Enter the filenames: " -a arr
for i in "${arr[@]}"
do
echo $i | sed 's/\(.*\)\..*/\1/'
cp -v ~/Desktop/library/template.py "$i".py
done
을 작성하면 이 스크립트는 A B.py C D.py
수행 중인 작업을 설명하는 A.py B.py C.py D.py
-v
플래그 로 변환합니다.cp -v
하지만 나는인쇄하고 싶지 않음편집된 파일 이름 echo $i
. 매우 짜증납니다.
어떻게 해야 하나요?
대체 솔루션도 높이 평가됩니다.
답변1
$i
문자열의 마지막 점 뒤의 값을 잘라내고 싶습니다 .
다음을 수행할 수 있습니다.
i=${i%.*}
$i
이렇게 하면 파일 이름 와일드카드 패턴과 일치하는 가장 짧은 접미사 문자열 .*
(점 뒤에 문자열이 옴)이 제거됩니다.
구체적으로 정리 하고 싶은 경우 .py
:
i=${i%.py}
cp
이는 다음과 같이 명령을 작성할 수 있음을 의미합니다 .
cp -v ~/Desktop/library/template.py "${i%.py}.py"
이것은 루프 본문의 유일한 명령이 되며, 값에 그러한 접미사가 있는 경우 .py
파일 이름 접미사를 제거한 다음 추가합니다. 이렇게 하면 접미사의 중복을 피하면서 대상 파일 이름에 항상 파일 이름 접미사가 있는지 확인됩니다.$i
.py
.py
스크립트 제안:
#!/bin/sh
for string do
cp -v ~/Desktop/library/template.py "${string%.py}.py"
done
또는,
#!/bin/zsh
for string; cp -v ~/Desktop/library/template.py $string:r.py
... zsh
쉘, 대체 짧은 루프 형식 for
및 수정자를 사용하여 파일 확장자를 이름에 추가하기 전에 제거합니다 :r
..py
다음과 같이 두 스크립트 중 하나를 호출할 수 있습니다.
./script A B.py C D.py
답변2
나는 트릭을 찾았습니다 :
#!/bin/bash
read -r -p "Enter the filenames: " -a arr
for i in "${arr[@]}"
do
var=$(echo "$i" | sed 's/\(.*\)\..*/\1/')
cp -v ~/Desktop/library/template.py "$var".py
done