여러 디렉터리의 이름을 바꾸는 방법은 무엇입니까?

여러 디렉터리의 이름을 바꾸는 방법은 무엇입니까?

이것은 내 디렉토리입니다:

P [001]
P [002]
P [003]

이름을 다음으로 바꾸고 싶습니다.

P001
P002
P003

나는 코드를 사용했습니다 :

for P in *\ *; do mv '$P' '${P// /_}'; done

하지만 뭔가 빠졌어요.

답변1

노력하다prename

$ ls
P [001]  P [002]  P [003]
$ prename 's/[ \[\]]//g' P\ *
$ ls
P001  P002  P003
$

'또는 원래의 스크립팅 접근 방식을 고수하십시오(정규식을 약간 변경 "하고 약간 변경함).

$ ls
P [001]  P [002]  P [003]
$ for P in *\ *; do mv "$P" "${P//[\[\] ]/}" ; done
$ ls
P001  P002  P003
$

답변2

디렉토리가 서로 내부에 있는 경우, 즉 이 작업을 재귀적으로 수행하면 위의 답변 중 어느 것도 작동하지 않습니다(아마도 prename작동할지 확실하지 않습니다). 예를 들어:

P [1]
   |___P [10]
   |___P [11]
         |___P [112]
         |___other
               |___P [113]
P [21]
P [132]

패키지를 설치하지 않고도 사용할 수 있습니다.

find . -type d -name 'P [*' -printf "echo mv \'%h/%f\' \'%h/\$(echo %f | sed \"s/[][ ]//g\")\'\n" | sort -r | sh

테스트 및 실제 작업 수행:

find . -type d -name 'P [*' -printf "mv \'%h/%f\' \'%h/\$(echo %f | sed "s/[][ ]//g\")\'" | sort -r | sh

설명: 현재 폴더( find .) 를 찾고 -type d이름이 ( )와 일치하는 모든 디렉터리( )를 찾아 실행에 전달될 명령을 인쇄합니다 - name 'P [*'. %h 및 %f를 찾은 파일의 경로와 이름으로 바꿉니다. 이 섹션에서는 모든 파일 이름( )에서 ( ) 대괄호( )와 공백( [ ] )을 공백( )으로 바꾸는 명령이 필요합니다. 이러한 명령을 실행하기 전에 역순 정렬( )( )하는 것이 중요합니다. 그렇지 않으면 하위 폴더의 이름을 바꾸기 전에 상위 폴더의 이름을 바꿀 수 있으며 명령이 실패합니다.shprintf$(echo %f | sed 's/[][ ]//g')seds/][//g| sort -r| sh

유용하길 바랍니다.

편집: @AdminBee 덕분에 이름 공백 문제가 해결되었습니다.

답변3

공백을 제거하려면 다음과 유사하지만(실제로는 밑줄로 대체함) 작은 따옴표 대신 큰 따옴표를 사용해야 변수 확장이 방지됩니다.

P또한 변수가 디렉터리인지 파일인지 확인하는 것이 아니기 때문에 파일 이름을 바꿀 수도 있다는 점에 유의해야 합니다 .

for P in *\ *;
do
    [ -d "$P" ] && mv "$P" "${P// /_}" || echo 'skipping, the'"$P"' is not a directory'
done

다음을 수행하여 모든 공백/괄호를 제거할 수도 있습니다.

find -maxdepth 1 -type d -name 'P*' -exec bash -c 'echo ${1} ${1//[][ ]}' bash {} \;
./P [001] ./P001
./P [002] ./P002
./P [003] ./P003

답변4

먼저 큰따옴표를 사용해야 합니다.$P

단일 명령은 아니지만 다음 작업을 수행해야 합니다.

for P in *\ *; do rename "s/ //g" * && rename "s/[][]//g" *; done

첫 번째 이름 바꾸기에서는 공백이 제거되고, 두 번째 이름 바꾸기에서는 대괄호가 제거됩니다.

관련 정보