파일 이름을 바꾸는 스크립트를 작성 중입니다. 파일 이름의 현재 구문은 입니다 program 1.c
. 로 변경하고 싶습니다 cprogram-program1.c
.
이 형식을 얻을 수 없습니다. 단순화를 위한 몇 가지 조건은 다음과 같습니다.
- 10개의 파일, 즉 0,1,2,3..9만 있다고 가정합니다.
이를 달성하기 위한 내 프로그램은 다음과 같습니다.
먼저 특정 패턴을 따르는 파일을 찾기 위해 파일을 필터링해야 합니다.
그런 다음 파일 이름을 하위 문자열 무시자로 필터링하여 올바른 형식인지 확인해야 합니다.
형식이 올바른 경우 필요한 방식으로 파일 이름을 편집할 수 있습니다.
1단계와 2단계에서 막혔어요. 제가 하고 있는 일은 다음과 같습니다.
for fn in *; do --> this loops over the files
program=${fn:0:7}
number=${..} --> number between 0 and 9
extension=${..} --> gets file extension like .c
if [ "$program" == "program" ]
then
if [ "$number" -ge 0 ] && [ "$number" -le 9 ]
then
if [ "$extension" == ".c" ]
then
--> edit code
fi
fi
fi
done
내 질문: 위의 예를 여러 가지 순열로 시도했지만 원하는 것을 얻을 수 없습니다. 도움, 간단한 접근 방식을 높이 평가하겠습니다.
감사해요
답변1
for fn in *
do case $fn in
(program*[1-8].c)
: do something;;
(other*program*[09].ext)
: do something with this match;;
(this*match|*or*|*any*"$of"*these*matches)
: do something with these matches
: do as many lines as you want;;
(*) : catch all last default match
esac
done
명령문의 일반적인 기술은 case
일반적으로 필요한 것보다 더 구체적인 패턴으로 원치 않는 일치 항목을 잘라내는 것입니다. 예를 들어:
for fn in *
do case $fn in
(*[0-9][0-9].c) ;;
(program*[1-8].c)
echo mv "$fn" "${fn%???}0${fn#"${fn%???}"}"
esac
done
위 예에서 첫 번째 *[0-9][0-9].c
패턴은 $fn
확장자 왼쪽에 두 개 이상의 숫자가 나타날 수 있는 모든 값과 일치합니다. 이러한 일치 항목에 대한 실행 블록은 비어 있으며(null) 일치 항목이 발견되면 아무 일도 일어나지 않습니다. 그러나 가장 중요한 것은 case
명령문이 하향식으로 작동하기 때문에 액션 블록과 일치하는 유일한 결과에는 확장자의 왼쪽에 있는 한 숫자만 포함되며 예제 명령은 각 발생 앞에 숫자를 echo
삽입 한다는 것을 의미합니다. 1에서 1 사이의 숫자 0
8.
답변2
또는 스크립트를 버리고 rename
대신 도구를 사용하십시오.
rename
실망스럽게도 배포판에 따라 (적어도) 두 가지 다른 인스턴스가 있습니다 . 일부 시스템에서는 Perl 버전을 이라고 할 수 있습니다 prename
. 그러나 를 실행하면 어떤 버전인지 알 수 있습니다 rename -n ';' /dev/null
. 아무 일도 일어나지 않으면 Perl 버전을 사용하고 있는 것입니다. 오류가 발생하면 이는 또 다른 오류입니다.
현재 파일 이름 구문은 입니다
program 1.c
. 로 변경하고 싶습니다cprogram-program1.c
. 파일이 9개만 있다고 가정해 보겠습니다. 즉, 0,1,2,3..9
Perl 기반
rename
(prename
)rename 's/^/cprogram-/; s/\s//' program\ ?.c
또 다른
rename
rename -v 'program ' cprogram-program program\ ?.c