디렉토리의 모든 파일에 대해 파일 이름의 밑줄을 공백으로 바꾸고 싶습니다.
나는 이 솔루션을 시도했지만 내가 원하는 것과 반대되는 결과를 얻었습니다.https://stackoverflow.com/questions/1806868/linux-replacing-spaces-in-the-file-names
그러나 공백은 밑줄로 바뀌었습니다. 작동하지 않아 오류가 발생합니다.
´x´ is not a directory
예를 들어 x는 파일 이름의 마지막 단어입니다.hello_world_x
디렉토리의 모든 파일에서 밑줄을 공백으로 바꾸는 올바른 명령은 무엇입니까?
답변1
올바른 디렉토리로 CD를 이동하면 이 스크립트가 사용자의 요구 사항을 안정적으로 해결합니다(확장으로 인해 이식 가능하지 않음 ${var//pat/str}
).
#!/bin/bash
set -- *_*
for file; do
mv -- "$file" "${file//_/ }"
done
*_*
*_*
glob은 이름에 포함된 모든 파일을 선택합니다 ._
set --
$1
이러한 이름(공백이나 개행 포함)은 간단한 명령 등을 통해 위치 인수로 안정적으로 설정됩니다 .$2
set -- "list"
for file;
그러면 각 위치 매개변수가 차례로 var 파일에 할당됩니다.
do ... done
(각각에 대해) 실행할 명령을 포함합니다 $file
.
mv -- "$file" "${file//_/ }"
각 파일을 동일한 이름으로 이동(이름 바꾸기)하고 _
각각(모두)을 (공백)으로 바꿉니다.
노트-i
: 기존 파일을 덮어쓰지 않도록 (대화형) 옵션을 추가할 수 있습니다 . 파일이 존재하는지 mv
묻습니다 . 한 가지 주의할 점은 mv
사용자와 통신할 수 있는 대화형 셸이 필요하다는 것입니다.
mv -i -- "$file" "${file//_/ }"
답변2
링크한 답변에서 코드를 복사하여 더욱 강력하게 만들었습니다.
for file in *; do mv "$file" "$(echo "$file" | tr '_' ' ')" ; done
mv
인용하면 각 파일 이름이 공간 경계에서 손상되지 않고 단일 토큰으로 전달됩니다 .
Perl 기반 이름 바꾸기 유틸리티에 액세스할 수 있는 경우 다음도 작동합니다.
rename -n 's/_/ /g' *
( -n
미리보기가 원하는 것과 일치하는지 확인한 후 스위치를 제거하십시오.)
답변3
find . -depth -name "*_*" -exec \
sh -cf '
for f do IFS=_
IFS=\ set "${f%/*}/"${f##*/}$0
mv "$f" "$*"
done
' _ {} +
POSIX는 sh
구성 변경을 확장합니다.내부 필드 구분 기호.