이름 바꾸기 명령을 사용하여 파일 이름 바꾸기

이름 바꾸기 명령을 사용하여 파일 이름 바꾸기

다음 명령에 어떤 문제가 있는지 알려주세요.

find /tmp/dir -name "* *" -type f | rename 's/*/fixed_/g'

참고 - 저는 루프 구문보다는 명령을 사용하여 이 작업을 수행하는 것을 선호합니다.

내가 원하는 것은 이름을 추가하여/tmp/dir 아래의 모든 파일 이름을 바꾸는 것입니다안정적인_각 파일 앞에

예를 들어 (파일)

Fevc.txt
Ddve.txt

다음으로 이름을 바꿔야 합니다:

fixed_Fevc.txt
fixed_Ddve.txt

답변1

임시 참고 사항: 문제가 있습니다. 이름 바꾸기 모드는 경로가 있는 파일 이름을 처리하지 않습니다. 수정 작업 중입니다.

명령에 두 가지 오류가 있습니다.

find /tmp/dir -name "* *" -type f | rename 's/*/fixed_/g'

  • 공백이 포함된 파일 이름 만 일치시키십시오 -name "* *". 이는 원하는 바가 아닙니다. 그렇죠?

    • 해결책은 이를 제외하는 것입니다. 특정 이름과 일치하는 파일을 제외하고 싶지는 않습니다. 모든 파일을 원합니다.
  • rename모델은 두 가지 측면에서 잘못되었습니다.

    • Shell glob 패턴을 사용했지만 정규 표현식, 즉 정규 표현식이어야 합니다(일부 일반적인 Perl 표현식일 수 있습니다. 무시하고 그냥 사용하겠습니다 s///g).
    • 고정 패턴은 전체 이름과 일치하여 로 대체됩니다 fixed_. 기술적으로는 "처음 0 문자"를 로 "바꾸고 싶습니다" fixed_. 이것은 와 일치하는 줄의 시작 부분입니다 ^. g한 줄에 한 번만 교체하면 되므로 생략할 수 있습니다 .

모두 종합하면 다음과 같습니다.

find /tmp/dir -type f | rename 's/^/fixed_/'

답변2

시스템이 이전 버전인 것 같습니다.이름을 바꿔라정규식은 사용되지 않습니다. 다음 명령을 사용하여 파일 이름을 바꿀 수 있습니다

cd /tmp/dir/
for f in *\ * ; do
    [[ -f $f ]] && mv "$f" fixed_"$f"
done

(테스트되지 않음)

~을 위한이름을 바꿔라정규식을 지원하는 명령의 경우 정규식을 변경해야 합니다. *"이전 작업을 0회 이상 반복"을 의미하는 작업이 필요합니다. 아무것도 바꾸고 싶지 않고 앞에 뭔가를 추가하고 싶으므로 ^which를 사용하여 문자열의 시작을 나타냅니다.

rename 's/^/fixed_/'

답변3

zsh 솔루션에 관심이 있는 분이라면

 cd /tmp/dir
 for f (*(.)) mv $f fixed_$f

여기서 (.)는 파일만을 의미합니다.

더 간단한 경우

 for f (*.txt) mv $f fixed_$f

관련 정보