답변:
간단한 1- 라이너가해야합니다 (Posix sh
호환 쉘을 가정 ) :
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
설명:
for ... in ...; do ...; done
A는 루프
*:*
현재 디렉토리 :
의 이름 에있는 모든 파일 및 디렉토리 와 일치
f
루프에서 이러한 각 파일 이름에 차례로 할당됩니다.
mv
첫 번째 인수를 두 번째 인수로 이름을 바꿉니다. -v
(자세한 내용)은 자신이하는 일을 인쇄하도록 요청합니다. 이 옵션은 GNU-utils에 따라 다르므로 Linux에서는 사용할 수 있지만 Solaris에서는 사용할 수 없습니다
$(...)
서브 쉘에서 코드를 실행하고 출력을 대체
echo
인수를 표준 출력에 인쇄합니다
tr
제공된 맵에 따라 표준 출력을 읽고 문자를 번역합니다.
당신이 사용하는 경우 bash는 , 당신은 여분의 쉘 (산란을 방지 할 수 있습니다 $()
하위 프로세스와을 () tr
로 대체하여) $(...)
와 함께 ${f//:/-}
.
$(echo "$f" | tr ':' '-')
과를 "${f//:/-}"
하고 서브 쉘, 파이프 및 외부 프로그램 호출을 피하십시오. 나는 이것이 bashism이라고 생각하지만, eh. 여기를 참조하십시오 .
유닉스 전문가가 bash 로이 작업을 수행 할 수 있다고 확신하지만 루비가있는 빠르고 더러운 버전이 있습니다.
path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
`mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end
path_to_files를 이름이 잘못된 파일의 경로로 설정하십시오. 위의 코드를 rename.rb라는 파일에 저장 한 다음 :
username@machinename$ ruby rename.rb
하나 또는 몇 개의 파일 만 있으면 이름을 바꿀 수 있습니다.
p="201*"
.old_name=$(ls | grep $p)
.필요한 문자 교체와 함께 새 파일 이름 을 저장하십시오 .
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
보너스 정리 :
a. 균일 성을 위해 대시 (-
)와 콜론 (:
)을 밑줄 (_
)로 바꾸려면 다음과 같이하십시오.
new_name=$(ls | grep $p | tr ':-' '_');
비. 마지막 밑줄 () 바로 가기를 원하면 variable을 다음과 같이 .txt
설정 new_name
하십시오.
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
NB : mv
이름 바꾸기 작업에서 파일 이름이 있으면 실패 spaces
합니다. 이 경우 다음과 같이 적절한 변수를 따옴표로 묶으십시오. mv "$old_name" $new_name
OR mv $old_name "$new_name"
OR mv "$old_name" "$new_name"
1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name
1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name
2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name
3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
이것은 과잉 일 수 있지만이 답변에 제공된 링크에서 스크립트를 사용하여 특수 문자의 이름을 바꿀 수 있습니다.
for f in
... 루프는 파일이 일치해야하는 현재 디렉토리의 모든 파일을 반복하는 루프입니다*:*
. (일치하는 디렉토리는 어떻게됩니까?) move 명령은으로 쉘을 실행하여 새 이름이 생성되는 move oldname newname입니다$( subshell here )
. tr이하는 일, ...