Linux에서 모든 폴더와 파일의 이름을 소문자로 바꾸려면 어떻게합니까?


179

대문자 폴더가 어디에도 나타나지 않도록 전체 폴더 트리의 이름을 재귀 적으로 바꿔야합니다 (C ++ 소스 코드이지만 중요하지는 않습니다).

CVS 및 Subversion 버전 제어 파일 / 폴더를 무시하기위한 보너스 포인트. 쉘은 모든 Linux 상자에서 사용 가능해야하므로 쉘 스크립트가 선호됩니다.

파일 이름 변경에 대한 세부 사항에 대한 몇 가지 유효한 인수가있었습니다.

  1. 소문자 이름이 같은 파일은 덮어 써야한다고 생각합니다. 그것은 사용자의 문제입니다. 대소 문자를 무시하는 파일 시스템에서 체크 아웃하면 첫 번째 파일 시스템도 덮어 씁니다.

  2. AZ 문자를 고려하여 az로 변환하고 다른 모든 것은 문제를 요구합니다 (적어도 소스 코드 사용).

  3. 스크립트는 Linux 시스템에서 빌드를 실행하는 데 필요하므로 CVS 또는 Subversion 버전 제어 파일에 대한 변경은 생략해야한다고 생각합니다. 결국, 그것은 단지 스크래치 체크 아웃입니다. 아마도 "수출"이 더 적합 할 것입니다.


이전에 게시 된 내용은 기본적으로 완벽하게 작동하거나 간단한 경우에 대한 몇 가지 조정으로 작동하지만 배치 이름 바꾸기를 실행하기 전에 고려해야 할 몇 가지 상황이 있습니다. 경로 계층 구조에서 ABCdef, abcDEFaBcDeF? 와 같이 대소 문자 만 다른 동일한 수준 이름 바꾸기 스크립트가 중단되거나 경고하고 계속해야합니까? 2. US-ASCII 이외의 이름에 대해 소문자를 어떻게 정의합니까? 그러한 이름이 존재할 수있는 경우 먼저 한 번의 확인 및 제외 단계를 수행해야합니까? 3. 이름 변경 작업을 실행중인 경우
Mihai Limbășan

답변:


179

"rename"명령을 사용하는 간결한 버전 :

find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

이렇게하면 파일보다 디렉토리 이름이 바뀌거나 존재하지 않는 디렉토리 (예 : "A/A""a/a") 로 파일을 이동하려는 문제가 발생하지 않습니다 .

또는를 사용하지 않고 더 자세한 버전 "rename"입니다.

for SRC in `find my_root_dir -depth`
do
    DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'`
    if [ "${SRC}" != "${DST}" ]
    then
        [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed"
    fi
done

추신

후자는 이동 명령 (예 :)으로 더 많은 유연성을 허용 "svn mv"합니다.


36
'y / AZ / az /'의 이름도 바꿀 수 있습니다.
Tzury Bar Yochay

3
두 버전 모두 대소 문자를 구분하지 않는 파일 시스템에서 작동하지 않습니다. 필자의 경우 then-닫힌 줄을로 바꿨습니다 (mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed".
Lloeki

6
두 번째 방법은 공백이 포함 된 파일 (문맥 : linux, bash)에서 제대로 작동하지 않았습니다.
희미한

4
마지막 버전의 이름 바꾸기를 사용하면 정규식이 필요하지 않습니다. 전체 명령이됩니다 find my_root_dir -depth -exec rename -c {} \;. 대소 문자를 구분하지 않는 파일 시스템 (예 : Mac) 인 경우 이름을 바꾸려면 -f를 추가하십시오.
Javache

두 번째 -Tmv명령 에서 제거하여 Solaris에서 나를 위해 일했습니다 .
Ham

261

더 작은 여전히 ​​나는 아주 좋아 :

rename 'y/A-Z/a-z/' *

OS X의 HFS + 와 같이 대소 문자를 구분하지 않는 파일 시스템 에서는 -f플래그 를 추가하려고합니다 .

rename -f 'y/A-Z/a-z/' *

3
linux.icydog.net/rename.php :The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
sleepsort

1
감사합니다, 나는 이런 식으로 그것을 사용 $ 찾기 | xargs의 이름이 'y / AZ / az /'로
Rashi

5
이것은 perls 이름 바꾸기가 있다고 가정하지만 항상 그런 것은 아닙니다. 예를 들어, 내 데비안 이름 변경은 완전히 다릅니다
Krzysztof Krasoń

10
Arch에서는 프로그램이 호출 perl-rename되며 같은 이름의 패키지로 제공됩니다.
jaymmer-Reinstate Monica

3
"이름 바꾸기"는 재귀 적이 지 않으므로 주어진 문제에 대한 답변이 아닙니다.
Cybolic

89
for f in `find`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done

스크립트를 실행하기 전에 "mkdir -p A / B / C"를 수행하십시오.
tzot

2
"찾기"는 이름을 바꾸려는 파일 목록을 얻는 데 사용하는 명령으로 대체해야합니다. 예를 들어 "ls *. {C, CPP, H}"입니다.
JPaget

2
OS X에서는 작동하지 않으며의 사용법 정보 만 인쇄합니다 find. find .이 문제를 해결하는 것 같습니다.
emlai

3
모든 의견에서 "통합 된"버전 (응답을 더 이상 편집 할 수 없음) :for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
romaricdrigon

1
누군가 왜 이것이 처음부터 작동하는지 설명 할 수 있습니까? ./FOO 및 ./FOO/BAR을 찾으면 먼저 ./FOO의 이름을 ./foo로 바꾸면 더 이상 ./FOO/BAR을 찾을 수 없습니다. 아래에 내 답변을 입력하면 문제가 해결됩니다.
oisyn 2012

80

효율성에 신경 쓸 필요가 없으면 간단히 다음을 시도하십시오.

zip -r foo.zip foo/*
unzip -LL foo.zip

13
와우, 그것은 꽤 비효율적 인 방법입니다.
Artjom B.

28
디렉토리에서 파일 이름을 바꾸어야 할 때 계산 효율성이 일반적으로 중요하지 않다고 가정하면 ...이 스레드에서 가장 창의적으로 간단한 솔루션이라고 생각합니다. 실제로이 사소한 것은 받아 들일만한 대답이 보여주는 것처럼 복잡하지 않아야 하며이 해결 방법은 이와 같은 작업에 투자하려는 생각의 양에 훨씬 비례합니다. +1000
Peter M. Elias

27
-0( '0', 압축 없음) 스위치를 사용 하여 속도를 높일 수 있습니다 zip -0 -r foo.zip foo/.
Johnny Baloney

3
다른 디렉토리 구조에서 50,000 개 이상의 파일 이름을 변경해야했습니다. 원래 수락 된 답변은 -0압축으로 거의 즉각적인 2 분 동안 10 %의 작업을 거의 수행하지 못했습니다 !
Peon

2
이것은 비효율적 인 것이 아닙니다. 임시 아카이브를위한 충분한 여유 공간이 없으면 이것은 불가능 합니다.
Victor Yarema

19

얘들 아, 너희들 / 여자들은 복잡한 것들을 지나치게 좋아한다.

rename 'y/A-Z/a-z/' *

2
이것은 작동하지 않으며 소문자 이름의 파일이 이미 존재한다고 말합니다.
kirhgoff

@kirhgoff NFS 마운트에서 발생하는 것을 보았습니다 . 여기 지침을 따르십시오 .
joebeeson

대소 문자 구분 파일 시스템에서 어떻게 이름을 바꿀 수 있습니까? rename 'y/a-z/A-Z/' /tmp/*.jpg-> Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directory즉, 파일 대신 전체 경로의 이름을 바꾸십시오.
파블로 A

14

위의 답변은 대부분 홀수 문자가 포함 된 이름을 다루지 않기 때문에 위험합니다. 이런 종류의 일에 대한 귀하의 안전한 내기 사용하는 것입니다 find-print0대신 ASCII NUL와 파일 이름을 종료합니다 \ n 옵션을.

다음은 혼동하지 않도록 디렉토리 이름이 아닌 파일 만 변경하는 스크립트입니다 find.

find .  -type f -print0 | xargs -0n 1 bash -c \
's=$(dirname "$0")/$(basename "$0");
d=$(dirname "$0")/$(basename "$0"|tr "[A-Z]" "[a-z]"); mv -f "$s" "$d"'

나는 그것을 테스트했고, 공백, 모든 종류의 따옴표 등을 포함하는 파일 이름으로 작동합니다. 루트로 실행하면 파일을 포함하는 트리에서 다른 스크립트 중 하나를 루트로 실행할 경우 중요합니다.

touch \;\ echo\ hacker::0:0:hacker:\$\'\057\'root:\$\'\057\'bin\$\'\057\'bash

... 잘 생각 해봐 ...


rename대신 사용 하는 것이 더 간단합니다 mv.
Victor Yarema

14

rename 명령 을 이미 설정했거나 설정 한 경우 (예 : Mac의 brew install 을 통해 ) 다음과 같이 작동합니다.

rename --lower-case --force somedir/*

9
... 예를 들어 다음을 통해 이름 바꾸기를 먼저 설정 한 경우brew install rename
pduersteler

3
'y / AZ / az /'이름 바꾸기 *
Stephen Stephen

4
--lower-case? 적어도 슬프게도 아치 리눅스에서는 그렇지 않다.

3
renamebash 내장이 아닙니다. 외부 유틸리티이며 구문은 설치 한 버전에 따라 다릅니다. 이 답변은 "모든 유닉스 기반 OS를위한"휴대용 솔루션으로는 충분하지 않다.
코리 골드버그

2
다만 검사의 rename명령을 통해 최신 페도라 (28)에 포함 util-linux-2.31이 없습니다, 패키지 --lower-case옵션을 선택합니다.
niXar

11

이것은 CentOS / Red Hat Linux 또는 renamePerl 스크립트가 없는 다른 배포판에서 작동합니다 :

for i in $( ls | grep [A-Z] ); do mv -i "$i" "`echo $i | tr 'A-Z' 'a-z'`"; done

소스 : 모든 파일 이름을 대문자에서 소문자로 바꿉니다 .

(일부 배포판에서 기본 rename명령은 util-linux에서 나 왔으며, 다른 호환되지 않는 도구입니다.)


이것은 재귀 적이 지 않은 단일 디렉토리에서만 작동합니다.
Bram

쿨 .. 잘 작동
마니

6

Mac OS X에서 가장 간단한 방법은 http://plasmasturm.org/code/rename/ 에서 이름 바꾸기 패키지를 사용하는 것입니다 .

brew install rename
rename --force --lower-case --nows *

--force 대상 이름을 가진 파일이 이미 존재하더라도 이름을 바꿉니다.

-소문자-파일 이름을 모두 소문자로 변환합니다.

--nows 파일 이름의 모든 공백 문자를 단일 밑줄 문자로 바꿉니다.


5

Bash 쉘 스크립트를 사용하는 차선책은 다음과 같습니다.

#!/bin/bash
# First, rename all folders
for f in `find . -depth ! -name CVS -type d`; do
   g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
   if [ "xxx$f" != "xxx$g" ]; then
      echo "Renaming folder $f"
      mv -f "$f" "$g"
   fi
done

# Now, rename all files
for f in `find . ! -type d`; do
   g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
   if [ "xxx$f" != "xxx$g" ]; then
      echo "Renaming file $f"
      mv -f "$f" "$g"
   fi
done

폴더 이름이 모두 올바르게 바뀌고 mv권한이 일치하지 않을 때 질문하지 않고 CVS 폴더 이름이 바뀌지 않습니다 (해당 폴더 내의 CVS 제어 파일 이름은 여전히 ​​불행하게도 바뀝니다).

"find -depth"와 "find | sort -r"은 모두 이름을 바꾸는 데 사용할 수있는 순서로 폴더 목록을 반환하므로 폴더 검색에 "-depth"를 사용하는 것이 좋습니다.


첫 번째 찾기가 작동하지 않습니다. "mkdir -p A / B / C"를 시도한 다음 스크립트를 실행하십시오.
tzot

4

원래 질문은 SVN 및 CVS 디렉토리를 무시하도록 요청했으며 find 명령에 -prune을 추가하여 수행 할 수 있습니다. 예를 들어 CVS를 무시하려면 :

find . -name CVS -prune -o -exec mv '{}' `echo {} | tr '[A-Z]' '[a-z]'` \; -print

[편집] 이것을 사용해 보았고, 소문자 번역을 찾기 안에 포함시키는 것은 실제로 이해하지 못하는 이유로 작동하지 않았습니다. 따라서 다음과 같이 수정하십시오.

$> cat > tolower
#!/bin/bash
mv $1 `echo $1 | tr '[:upper:]' '[:lower:]'`
^D
$> chmod u+x tolower 
$> find . -name CVS -prune -o -exec tolower '{}'  \;

이안


4

Larry Wall의 파일 이름 수정 프로그램 사용 :

$op = shift or die $help;
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
    $was = $_;
    eval $op;
    die $@ if $@;
    rename($was,$_) unless $was eq $_;
}

그것은 간단합니다

find | fix 'tr/A-Z/a-z/'

( fix물론 위의 스크립트는 어디에 있습니까 )


3

이것은 당신이 요청한 것을하는 작은 쉘 스크립트입니다 :

root_directory="${1?-please specify parent directory}"
do_it () {
    awk '{ lc= tolower($0); if (lc != $0) print "mv \""  $0 "\" \"" lc "\"" }' | sh
}
# first the folders
find "$root_directory" -depth -type d | do_it
find "$root_directory" ! -type d | do_it

첫 번째 찾기에서 -depth 조치를 참고하십시오.


1
전체 스레드에서 Mac에서 작동 한 유일한 것입니다. 고마워요!
YemSalat

2

이식성이 없으며 Zsh만이 아니라 매우 간결합니다.

먼저 zmv로드되어 있는지 확인하십시오 .

autoload -U zmv

또한 켜져 있는지 확인하십시오 extendedglob.

setopt extendedglob

그런 다음 사용하십시오.

zmv '(**/)(*)~CVS~**/CVS' '${1}${(L)2}'

이름이 CVS 가 아닌 파일과 디렉토리를 반복적으로 소문자로 변환합니다 .


2
for f in `find -depth`; do mv ${f} ${f,,} ; done

find -depth디렉토리 자체 전에 디렉토리의 내용을 인쇄하여 각 파일과 디렉토리를 인쇄합니다. ${f,,}파일 이름은 소문자입니다.


이것은 작동하지 않습니다 : 그것은 내용에 대해 작동하기 전에 디렉토리의 이름을 바꾸어 나중에 내용에 대한 시도가 실패합니다.
Prune

-depth그 수정을 추가 ! 이것은 정말 빠른 해결책이지만, 물론 -print0찾기 옵션을 사용 하지 않으면 가장 신뢰할 수 없습니다
jpaugh

@jpaugh 아닙니다. ./FOO/BAR의 이름을 ./foo/bar로 바꾸려고 시도하지만 ./foo는 아직 존재하지 않습니다.
oisyn 2012

2

MacOS로

rename패키지를 설치하십시오 .

brew install rename

사용하다,

find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"                       

이 명령은 *.py확장자 가있는 모든 파일을 찾고 파일 이름을 소문자로 변환합니다.

`f` - forces a rename

예를 들어

$ find . -iname "*.py" -type f
./sample/Sample_File.py
./sample_file.py
$ find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"
$ find . -iname "*.py" -type f
./sample/sample_file.py
./sample_file.py

여기서 -I옵션을 사용한 이유는 무엇 xargs입니까?
Victor Yarema

- I플래그는 필수가 아닙니다. 로 여러 명령을 실행할 때 사용됩니다 xargs. 여기에 여러 명령을 사용하는 예입니다 xargs cat foo.txt | xargs -I % sh -c 'echo %; mkdir %' 없이 실행할 수 있습니다 당신 -Ifind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
akilesh 주권은

2

조판 사용 :

typeset -l new        # Always lowercase
find $topPoint |      # Not using xargs to make this more readable
  while read old
  do new="$old"       # $new is a lowercase version of $old
     mv "$old" "$new" # Quotes for those annoying embedded spaces
  done

Windows에서 Git Bash 와 같은 에뮬레이션 은 Windows가 대소 문자를 구분하지 않으므로 실패 할 수 있습니다. 이를 위해서는 mv먼저 "$ old.tmp"와 같은 다른 이름에 파일의 단계를 추가 한 다음에 단계를 추가하십시오 $new.


1

길지만 "놀람과 설치없이 작동"

이 스크립트 는 공백, 따옴표, 기타 특수 문자 및 유니 코드로 파일 이름을 처리 하며 대소 문자를 구분하지 않는 파일 시스템 및 bash 및 awk가 설치된 대부분의 Unix-y 환경 (즉, 거의 모두)에서 작동합니다. 또한 파일 이름을 대문자로 남겨두고 충돌을보고하고 파일과 디렉토리의 이름을 바꾸고 재귀 적으로 작동합니다. 마지막으로 적응력이 뛰어납니다. find 명령을 조정하여 원하는 파일 / 디렉토리를 대상으로하고 다른 이름 조작을 위해 awk를 조정할 수 있습니다. "유니 코드 처리"는 실제로 대소 문자를 변환한다는 것을 의미합니다 (을 사용하는 답변처럼 무시하지 마십시오 tr).

# adapt the following command _IF_ you want to deal with specific files/dirs
find . -depth -mindepth 1 -exec bash -c '
  for file do
    # adapt the awk command if you wish to rename to something other than lowercase
    newname=$(dirname "$file")/$(basename "$file" | awk "{print tolower(\$0)}")
    if [ "$file" != "$newname" ] ; then
        # the extra step with the temp filename is for case-insensitive filesystems
        if [ ! -e "$newname" ] && [ ! -e "$newname.lcrnm.tmp" ] ; then
           mv -T "$file" "$newname.lcrnm.tmp" && mv -T "$newname.lcrnm.tmp" "$newname" 
        else
           echo "ERROR: Name already exists: $newname"
        fi
    fi    
  done
' sh {} +

참고 문헌

내 스크립트는 다음과 같은 훌륭한 답변을 기반으로합니다.

/unix/9496/looping-through-files-with-spaces-in-the-names

Bash에서 문자열을 소문자로 변환하는 방법은 무엇입니까?


1

이것은 macOS에서도 잘 작동합니다.

ruby -e "Dir['*'].each { |p| File.rename(p, p.downcase) }"

Ruby가 macOS와 함께 제공되므로 특히 좋습니다.
jxmorris12

1

Windows 7의 Cygwin 설치 에서이 작업을 수행해야했지만 위에서 시도한 제안에서 구문 오류가 발생했습니다 (작동 옵션이 ​​누락되었을 수 있음). 그러나 우분투 포럼 에서 바로이 솔루션 은 :-)

ls | while read upName; do loName=`echo "${upName}" | tr '[:upper:]' '[:lower:]'`; mv "$upName" "$loName"; done

(NB : 이전에 공백을 밑줄로 바꿨습니다.

for f in *\ *; do mv "$f" "${f// /_}"; done

)


1

OS X에서 mv -f"같은 파일"오류가 표시되므로 이름을 두 번 바꿉니다.

for i in `find . -name "*" -type f |grep -e "[A-Z]"`; do j=`echo $i | tr '[A-Z]' '[a-z]' | sed s/\-1$//`; mv $i $i-1; mv $i-1 $j; done

1

공백이나 슬래시가없는 경로를 낙관적으로 가정하지 않기 위해이 상황에서 Python에 도달 할 것입니다. 또한 python2보다 많은 장소에 설치 되는 경향이 있음을 발견했습니다 rename.

#!/usr/bin/env python2
import sys, os

def rename_dir(directory):
  print('DEBUG: rename('+directory+')')

  # Rename current directory if needed
  os.rename(directory, directory.lower())
  directory = directory.lower()

  # Rename children
  for fn in os.listdir(directory):
    path = os.path.join(directory, fn)
    os.rename(path, path.lower())
    path = path.lower()

    # Rename children within, if this child is a directory
    if os.path.isdir(path):
        rename_dir(path)

# Run program, using the first argument passed to this Python script as the name of the folder
rename_dir(sys.argv[1])

복잡하게 만드는 것에 대해 이야기하십시오 ... 그냥하세요. 이름을 'y / AZ / az /'로 바꾸십시오.
Stephen

1
@Stephen, 설치 이름 바꾸기를위한 관리자 액세스 권한이 있다고 가정합니다. 다른 소프트웨어를 설치할 수없는 시스템에서 데이터를 자주 숨길 필요가 있습니다. 최근 우분투 스에서는 perl이있는 경우에만 설치됩니다.
John Foley

1

Arch Linux 를 사용하는 경우 , rename패키지를 설치 AUR하여 renamexm명령을 /usr/bin/renamexm실행 파일과 함께 제공 하는 수동 페이지 를 제공 할 수 있습니다.

파일과 디렉토리의 이름을 빠르게 바꿀 수있는 강력한 도구입니다.

소문자로 변환

rename -l Developers.mp3 # or --lowcase

대문자로 변환

rename -u developers.mp3 # or --upcase, long option

다른 옵션

-R --recursive # directory and its children

-t --test # Dry run, output but don't rename

-o --owner # Change file owner as well to user specified

-v --verbose # Output what file is renamed and its new name

-s/str/str2 # Substitute string on pattern

--yes # Confirm all actions

필요한 경우 여기 에서 샘플 Developers.mp3 파일을 가져올 수 있습니다 .)


1
brewmacOS 에서 이름 바꾸기 -l는 심볼릭 링크를 만들고 -c소문자로 변환하는 것과 관련 이 있으므로 조심하십시오.
rien333

0
( find YOURDIR -type d | sort -r;
  find yourdir -type f ) |
grep -v /CVS | grep -v /SVN |
while read f; do mv -v $f `echo $f | tr '[A-Z]' '[a-z]'`; done

먼저 디렉토리의 이름을 sort -r (여기서 -depth를 사용할 수 없음)로 바꾼 다음 파일을 바꾸십시오 . 그런 다음 find ...- prune 대신 grep -v / CVS 가 더 간단합니다. 큰 디렉토리의 경우, f in ...의 경우 일부 쉘 버퍼가 오버 플로우 될 수 있습니다. 찾기 사용 ... | 그것을 피하기 위해 읽는 동안 .

그리고 네, 이것은 경우에만 다른 파일을 방해합니다 ...


첫째 : find YOURDIR -type d | sort -r너무 많은 문제입니다. 당신은 원합니다 find YOURDIR -depth -type d. 둘째, find -type f디렉토리 이름을 바꾼 후에 반드시 실행해야합니다.
tzot

0
find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh

여기에 언급 된보다 정교한 스크립트를 시도하지 않았지만 Synology NAS에서 단일 명령 줄 버전 중 어느 것도 나를 위해 작동하지 않았습니다. rename를 사용할 수 없으며 find이미 이름이 바뀐 경로의 이전 이름을 고수하는 것처럼 보이기 때문에 실패의 많은 변형이 있습니다 (예 :이 ./FOO뒤에 오는 경우 경로 ./FOO/BAR이름 이 더 이상 유효하지 않더라도 이름 바꾸기 ./FOO./foo계속 나열 됨 ./FOO/BAR) . 위의 명령은 아무런 문제없이 나를 위해 일했습니다.

다음은 명령의 각 부분에 대한 설명입니다.


find . -depth -name '*[A-Z]*'

.깊이 우선 검색을 사용하여 현재 디렉토리에서 파일 을 처리하고 (처리하려는 디렉토리로 변경 ) (예 : ./foo/bar이전에 나열 됨 ./foo) 대문자가 포함 된 파일 만 찾습니다. -name필터는 기본 파일 이름이 아닌 전체 경로에 적용됩니다. 따라서이 목록은 표시 ./FOO/BAR되지만 그렇지는 않습니다 ./FOO/bar. 이름을 바꾸고 싶지 않기 때문에 괜찮습니다 ./FOO/bar. 우리는 이름을 바꾸고 ./FOO싶지만 나중에 나열됩니다 (이것이 -depth중요한 이유 입니다).

이 comand 자체는 특히 이름을 바꾸려는 파일을 찾는 데 특히 유용합니다. 파일 이름 충돌 또는 오류로 인해 여전히 교체되지 않은 파일을 검색하려면 complete rename 명령 뒤에 이것을 사용하십시오.


sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'

이 부분은 출력 된 파일을 읽고 정규식을 사용하여 명령으로 find형식화합니다 mv. 이 -n옵션 sed은 입력 인쇄를 중지 p하고 검색 및 바꾸기 정규식 의 명령이 대체 된 텍스트를 출력합니다.

정규 표현식 자체는 마지막 / (파일의 디렉토리 인)까지의 부분과 파일 이름 자체의 두 가지 캡처로 구성됩니다. 디렉토리는 그대로 남아 있지만 파일 이름은 소문자로 변환됩니다. 따라서 find출력 ./FOO/BAR되면이됩니다 mv -n -v -T ./FOO/BAR ./FOO/bar. -n의 옵션을 mv확인 소문자 파일을 기존 차종은 덮어 쓰지 않습니다. 이 -v옵션은 mv모든 변경 사항을 출력합니다 (또는 ./FOO/bar존재 하지 않는 경우- 이미 존재 ./FOO/BAR -> ./FOO/BAR하는 경우 변경 사항이 없음을 나타내는 것과 같은 것을 출력합니다 ). 는 -T여기 매우 중요하다 -이 디렉토리로 대상 파일을 처리합니다. 그러면 해당 디렉토리가 존재하는 경우 ./FOO/BAR이동되지 ./FOO/bar않습니다.

이것을 함께 사용 find하여 실행될 명령 목록을 생성하십시오 (실제로 수행하지 않고 수행 할 작업을 확인하는 데 편리함)


sh

이것은 매우 설명이 필요합니다. 생성 된 모든 mv명령을 쉘 인터프리터로 라우팅합니다 . bash원하는대로 또는 원하는대로 바꿀 수 있습니다 .


0

Slugify Rename (정규식)

OP가 요청한 것이 아니라이 페이지에서 찾고자했던 것입니다.

파일 이름 바꾸기를위한 "슬러그 화"버전으로 URL과 유사합니다 (예 : 영숫자, 점 및 대시 만 포함).

rename "s/[^a-zA-Z0-9\.]+/-/g" filename

2
"정확히"? 이것은 OP가 무엇을 요구 전혀 아니다
코리 골드버그
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.