공백이 포함된 파일/디렉토리의 이름을 일괄적으로 바꾸는 방법은 무엇입니까?

공백이 포함된 파일/디렉토리의 이름을 일괄적으로 바꾸는 방법은 무엇입니까?

파일/디렉터리 이름의 조각을 교체하여 f o o많은 파일 및/또는 디렉터리의 이름을 일괄적으로 바꾸는 방법은 무엇입니까?b a r

제안된 각 방법에 대해 다음 질문에 답하는 것이 가장 좋습니다.

  • 실제 이름을 바꾸기 전에 명령 결과를 미리 볼 수 있습니까? 어떻게?
  • 이 방법은 접두사에만 적용되나요, 접미사에만 적용되나요, 아니면 둘 다에 적용되나요?
  • 이름 바꾸기는 디렉터리에만 영향을 미치나요, 파일에만 영향을 미치나요, 아니면 디렉터리와 파일 모두에 영향을 미치나요?
  • 하위 디렉터리의 파일/디렉터리 이름도 바뀌나요?

대체 접두사, 예

작업을 보다 구체적으로 만들기 위해 다음과 같은 파일을 가정해 보겠습니다
o l d prefix file 1.c
o l d prefix file 1.h
o l d prefix file 2.c
o l d prefix file 2.h
.
n e w prefix file 1.c
n e w prefix file 1.h
n e w prefix file 2.c
n e w prefix file 2.h

또한 동일한 디렉터리에 다음과 같은 파일이 있다고 가정합니다.
o l d prefix, dir 1 _
o l d prefix, dir 2 _

이 디렉토리의 이름도 변경됩니까?

파일이 아닌 디렉터리 이름만 바꾸도록 접근 방식을 조정할 수 있나요?
아니면 그냥 파일 이름을 바꾸나요(디렉토리 아님)?

접미사 바꾸기

이름 변경도 고려해보세요.접미사파일에서 so 및 는
file 1, o l d suffix각각 및 file 2, o l d suffix로 이름이 변경됩니다 .
file 1, n e w suffixfile 2, n e w suffix

디렉토리에도 마찬가지입니다. 및 각각의 이름 을
dir 1., o l d suffix바꿉니다 .dir 2., o l d suffix
dir 1., n e w suffixdir 2., n e w suffix

추천 방법은?

어떤 이름 변경 방법을 권장하시나요?

노트

알아채다다음에 추가이름의 접두사 또는 접미사는 보다 일반적인 특수 사례일 뿐입니다.바꾸다접두사 또는 접미사의 경우, 즉 원래 접두사 또는 접미사가 우연히 빈 문자열인 경우입니다. 마찬가지로 상황도제거하다접두사 또는 접미사는 접두사 또는 접미사를 바꾸는 특별한 경우이기도 합니다. 즉, 새로운 접두사 또는 접미사는 빈 문자열입니다.

고려해야 할 추가 문제

아래 참조의 마지막 5개 문제와 같이 날짜, 일련 번호 및/또는 제목을 추가하거나 제거하는 등 파일 이름을 바꿀 때 고려해야 할 다른 고급 문제가 있다는 것을 알고 있습니다.

파일/디렉터리(또는 심볼릭 링크) 이름 바꾸기에 대해 질문하고 답변에 적합한 예를 작성해 보시기 바랍니다.

답변을 작성할 때 답변을 해야 한다는 느낌을 받지 마세요.모두여기에 소개된 케이스!
그냥 따라하셔도 무방합니다하나원하는 경우 특정 상황(위의 상황 중 하나 또는 선택한 다른 상황).

인용하다

답변1

0. 보편적인 해결책을 모색하다 1

미래의 나와 다른 독자들의 편의를 위해 나는 다음에 집중할 것입니다.일반적인해결책.

단순화를 위해 다음이 있다고 가정합니다.아니요따옴표 – 큰따옴표( ") 및 작은따옴표( ') 없음 – in어느파일/디렉터리 이름. 2

첫 번째 예로, 패턴을 사용하여 파일 이름을
o l d prefix file *.*로 바꾸는 방법을 보여드리겠습니다
n e w prefix file *.*.
그러면 파일 이름에 공백이 있어도 접두사의 이름이 바뀌게 됩니다.

나는 또한 디렉토리 이름을 바꾸는 데 관심이 있으므로 디렉토리 이름을
o l d prefix, dir 1 _각각 과 o l d prefix, dir 2 _로 바꾸는 것을 고려해 보겠습니다 .
n e w prefix, dir 1 _n e w prefix, dir 2 _

둘째, 접미사를 바꾸는 방법을 보여 드리겠습니다. 예를 들어 파일
file 1, o l d suffix및 는 각각 및 file 2, o l d suffix로 이름이 변경됩니다 .
file 1, n e w suffixfile 2, n e w suffix

다시 한 번 이것이 디렉토리에 어떤 영향을 미치는지(또는 영향을 주지 않는지) 확인하고 싶습니다.
따라서 디렉토리 및 이름이
dir 1., o l d suffix각각 및 dir 2., o l d suffix로 바뀌 었는지도 확인하겠습니다 .
dir 1., n e w suffixdir 2., n e w suffix

위의 모든 파일과 디렉터리는 zip 파일에 포함되어 있습니다.
http://user.it.uu.se/~hesc0353/Files-&-dirs-SEunix-A690768.zip. 4

노트.
아래 솔루션에 존재한다는 것은 echo이름 변경이 발생하지 않음을 의미합니다.
이는 확립된 기술이다.시사이름을 바꾸기로 결정하기 전에.
미리보기가 좋아지면 echo명령을 삭제하고 다시 실행하여 실제 이름 바꾸기를 수행하십시오. 5

1. for 루프를 사용한 일반적인 솔루션

이름 바꾸기접두사6o l d prefix 으로 대체됨을 나타냅니다 n e w prefix.

for f in "o l d prefix"*; do\
 echo mv "$f" "n e w prefix""${f#o l d prefix}"; done

나는 검색을 선택했습니다 o l d pref.

이름 바꾸기접미사, 노력하다:

for f in *"l d suffix"; do\
 echo mv "$f" "${f%o l d suffix}""n e w suffix"; done

이름 바꾸기는 디렉터리에만 영향을 미치나요, 파일에만 영향을 미치나요, 아니면 디렉터리와 파일 모두에 영향을 미치나요?

– 이 방법으로 이름이 변경됨둘 다파일 및 디렉터리.
이것이 원하는 것이 아니라면 find ... -type ... -exec 다음 섹션의 방법을 시도해 보십시오.

하위 디렉터리의 파일/디렉터리 이름도 바뀌나요?

- 안 그럴 거예요. 위 명령 중 하나를 템플릿으로 사용해도 하위 디렉터리의 파일/디렉터리는 영향을 받지 않습니다. 이렇게 하려면 의식적으로 방법을 꽤 많이 조정해야 할 것입니다.
예를 들어 첫 번째 솔루션을 참조하세요.이 답변.

2. 범용 솔루션 사용find ... -exec mv

아래 방법은 find ... -exec mv파일 이름을 바꾸는 옵션을 제공합니다오직또는 디렉토리오직-type플래그를 통해. 또한 플래그를 통해 명령이 파일이나 디렉토리를 검색해야 하는 하위 디렉토리 트리의 깊이를 제어하도록 조정할 수도 있습니다 -maxdepth.

접두사 이름 바꾸기

다음 명령 은 o l d prefix으로 대체되지만n e w prefix디렉토리만. 각 파일은 별도의 하위 셸에서 이름을 바꿀 수 있지만 내부적으로 for 루프를 사용하면 -exec( final이 아닌 -exec동시 ) 명령이 더 효율적으로 실행됩니다.sh {} +{} \;

find . -maxdepth 1 -type d -name "o l d pr*" -exec sh -c\
 'for n; do echo mv "${n#./}" "n e w pre${n#./o l d pre}"; done' sh {} +

이름을 바꾸고 싶다면파일만, -type f대신 사용하세요 -type d(기억하기 쉬움: f파일용, d디렉터리용).

접미사 이름 바꾸기

이번에도 교체방법을 알려드리겠습니다접미사많은 수로문서:

find . -maxdepth 1 -type f -name "*d suffix" -exec sh -c\
 'for n; do echo mv "$n" "${n%o l d suffix}n e w suffix"; done' sh {} +

설명하다

  • find .현재 디렉터리와 해당 하위 디렉터리 내에서 검색합니다.
  • -maxdepth 1하다아니요하위 디렉터리에서 검색하세요.
  • -type f파일만 찾습니다(디렉토리 제외).
  • -name "*d suffix"로 끝나는 파일만 검색합니다 d suffix.
  • -exec sh -c '...'서브셸에서 실행되어 명령 대체가 가능합니다 $(...).
  • -exec sh -c 'for n; do mv ...' sh {} +
    -exec sh -c 'mv ...' {} \;다른 방법으로 동일한 작업을 수행하는 것보다 더 효율적입니다. 7
  • {}당신이 찾은 것은 무엇이든지 붙잡으세요 find.
  • echo명령 결과 출력 - 결과에 만족하면 명령을
    삭제 하고 다시 실행합니다.echo
  • mv "sou rce" "dest in"실제 이름 바꾸기를 수행하여
    이전 이름을 새 이름으로 바꿉니다.sou rcedest in
  • %바라보다POSIX 쉘 모드 필터링.
  • donefor 루프를 종료합니다.
  • sh {} +앞서 언급했듯이 절 sh {} +을 끄십시오 -exec sh -c .

이름을 바꿔라둘 다파일 및 디렉토리

의도적인 이름 바꾸기둘 다파일과 디렉터리는 한 번에 완료됩니다 -type. 다음을 생략하세요.

find . -maxdepth 1 -name "o l d pr*" -exec sh -c\
 'for n; do echo mv "${n#./}" "n e w pre${n#./o l d pre}"; done' sh {} +

하위 디렉터리의 파일/디렉터리 이름도 바뀌나요?

-maxdepth 1절은 하위 디렉터리 트리의 파일/디렉터리가 영향을 받지 않도록 합니다.
의도적으로 접미사의 이름을 바꾸려는 경우모두파일은 다음 위치에 있습니다.모두 하위 디렉터리에 대한 예는 다음과 같습니다.

find . -type f -name "*d suffix" -exec sh -c\
 'for n; do echo mv "$n" "${n%o l d suffix}n e w suffix"; done' sh {} +

경고의 말씀.
이 방법은아니요하나의 명령으로 다양한 하위 디렉터리의 접두사 이름을 바꾸는 데 사용됩니다.

3. Perl 이름 바꾸기를 사용한 솔루션

이 섹션은 특히 다음과 같은 사람들을 위한 것입니다: 래리 월(Larry Wall)이 Perl의 이름을 바꾸다 시스템에 설치되어 있는지(또는 설치 방법을 알고 있는지) 8

renameprename나는 Perl 스크립트 와 혼동을 피하기 위해 Perl 스크립트의 이름을 바꾸는 신중한 관행을 좋아합니다.리눅스 이름 바꾸기.

이 방법은 접두사에만 적용되나요, 접미사에만 적용되나요, 아니면 둘 다에 적용되나요?

접두어 또는 접미어의 이름을 바꾸는지 신경 쓸 필요가 없다는 사실은 Perl의 이름 바꾸기를 사용하기 쉽게 만듭니다.

예를 들어 다음으로 바꾸려면 다음 o l d prefix과 같이 하십시오 n e w prefix.

prename -n 's/o l d prefix/n e w prefix/' ./"o l d p"*

어떤 -n플래그가시사.
원하는 결과가 나오면 플래그를 제거 -n하고 명령을 다시 실행하십시오.

이름 바꾸기는 디렉터리에만 영향을 미치나요, 파일에만 영향을 미치나요, 아니면 디렉터리와 파일 모두에 영향을 미치나요?

섹션 1의 for 루프 방법과 마찬가지로 실행하면 prename이름이 변경됩니다.둘 다디렉터리 및 파일.

if -f그러나 이름 바꾸기 문자열 끝에 다음을 추가하여 파일(디렉토리 아님)만 이름을 바꾸도록 선택할 수 있습니다 .

prename -n 's/o l d prefix/n e w prefix/ if -f' ./"o l d p"*

파일이 아닌 디렉토리의 이름을 바꾸려면 다음을 사용하십시오 if !-f.

prename -n 's/o l d prefix/n e w prefix/ if !-f' ./"o l d p"*

하위 디렉터리의 파일/디렉터리 이름도 바뀌나요?

슬래시( /)를 구분 기호로 사용할 때 Perl 이름 바꾸기는 하위 디렉터리가 아닌 현재 작업 디렉터리의 파일/디렉터리 이름만 바꾸는 것으로 나타났습니다.
다른 문자를 구분 기호로 사용하는 경우 실제로 이를 사용하여 prename하위 디렉터리 트리의 파일/디렉터리 이름을 바꿀 수 있습니다.
두 번째 해결책은이 답변다소 비정통적인 접근 방식의 예입니다.

보다 일반적인 접근 방식은 find ... -execdir와 결합하는 것 입니다 prename.
이에 대한 예는 다음을 참조하세요. 이 답변.

4. 파일이나 디렉터리 이름을 바꾸는 데 유용한 기타 옵션

위의 방법이 마음에 들지 않으면 sed또는 awk(아마도 와 함께 xargs) 사용을 고려하십시오.

인용하다


1 이 답변에 제공된 명령/솔루션을 테스트할 때 정품 Linux나 정품 Unix가 아닌 Windows 10의 MSYS2를 사용했습니다. 이는 아마도 Microsoft Windows(Linux)에서 실행되는 시뮬레이션된 아치일 것입니다. 물론 나와 같은 Windows 사용자에게 실행 가능한 대안은 다음을 사용하는 것입니다. Linux용 Windows 하위 시스템(WSL).
MSYS2는 편리하고 사용하기 쉽기 때문에 사용합니다.

2 의심스러운 경우 명령 결과를 확인하고
이름 바꾸기를 고려하십시오 . 아니면 더 나은 방법은 다음 과 같습니다 . 파일/디렉토리 이름에 따옴표를 사용하는 것은 분명히 문제를 야기한다고 생각합니다.ls *\"*ls *\'*
find . -name '*"*'find . -name "*'*"

이 답변파일/디렉터리 이름에 금지된 문자를 나열합니다.
– Linux/Unix의 경우 금지 문자는 슬래시( /) 하나만 있습니다.

3나는 할 것이다아니요질문에서 요구한 대로 접두사와 접미사를 한 번에 바꿀 수 있는 해결책을 찾는 것이 목표입니다. Bash를 사용하여 파일 이름 바꾸기, 접두사 및 접미사 제거. (접두사와 접미사의 이름을 바꿔야 하는 경우 한 명령에서 하나를 바꾸고 다른 명령에서 다른 이름을 바꾸는 것이 좋습니다.)

4 독자들이 zip 파일을 다운로드하여 일부 (빈) 디렉터리에 압축을 풀고 이 답변에 제공한 모든 명령을 시도해 볼 것을 권장합니다.

5 공백이 포함된 파일 및 디렉터리의 경우 앞뒤에 큰따옴표( )가 없기 때문에 미리보기가 올바르지 않게 보일 수 있습니다 ". 이를 제거해도 echo명령이 올바르게 실행됩니다.
(미리보기를 문자 그대로 받아들이지 마세요!)

6 긴 명령을 줄바꿈하기 위해 백슬래시( \)를 사용하므로 독자가 가로로 스크롤할 필요가 없습니다. 구체적인 예제를 직접 작성하는 경우 백슬래시를 제거하고 전체 명령을 한 줄에 작성하는 것이 좋습니다.

7{} + 차이점에 대해 자세히 알아보려면 {} \;예제를 참조하세요. 호출된 쉘 명령을 종료하는 방법-exec(및 해당 참조).

8 터미널에 rename또는 를 입력해 보십시오. Perl rename을 설치했다면 해당 단어가 포함된 유사 항목을 볼 수 있을 것입니다. 설치되지 않은 경우 비슷한 내용이 나타날 것으로 예상됩니다. 시도해 볼 수 있는 또 다른 방법은 다음과 같습니다.prenameEnterUsage: rename [-v] [-n] [-f] perlexpr [filenames]perlexpr
bash: prename: command not found
which prename

9 이 댓글if -f절은 심볼릭 링크의 이름도 변경한다고 가정해 보겠습니다. 심볼릭 링크의 이름을 바꾸지 않으면
대신 심볼릭 링크를 사용하는 것이 좋습니다.if (-f && ! -l)

관련 정보