이것은 내 디렉토리입니다:
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를 찾은 파일의 경로와 이름으로 바꿉니다. 이 섹션에서는 모든 파일 이름( )에서 ( ) 대괄호( )와 공백( [ ] )을 공백( )으로 바꾸는 명령이 필요합니다. 이러한 명령을 실행하기 전에 역순 정렬( )( )하는 것이 중요합니다. 그렇지 않으면 하위 폴더의 이름을 바꾸기 전에 상위 폴더의 이름을 바꿀 수 있으며 명령이 실패합니다.sh
printf
$(echo %f | sed 's/[][ ]//g')
sed
s/
][
//
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
첫 번째 이름 바꾸기에서는 공백이 제거되고, 두 번째 이름 바꾸기에서는 대괄호가 제거됩니다.