디렉터리에 있는 여러 파일의 부분 파일 이름을 변경합니다.

디렉터리에 있는 여러 파일의 부분 파일 이름을 변경합니다.

한때 다음을 수행하는 스크립트가 있었습니다. 현재 디렉터리에 있는 여러 파일의 파일 이름 중 일부 이름이 변경됩니다.

예를 들어:

rename variable1 variable2

rename 456 555

입력하다:

testa456testa
sama456sama
apple456applea
johna_456_johna
davida_456_davidb

산출:

testa555testa
sama555sama
apple555applea
johna_555_johna
davida_555_davidb

나는 더 이상 스크립트가 없으며 Unix를 처음 접했습니다. 명령줄에서 사용할 수 있는 스크립트가 필요합니다.

내가 지금 하고 있는 일은:

임시 파일 이름으로 나열된 "ls *(filename)" 파일이 있습니다. 그런 다음 %/s/456/555/g를 검색합니다. 그런 다음 이전 파일 이름을 모두 새 파일 이름으로 옮겼습니다. "$1을 $2로 이름 바꾸기" 명령줄에서 이 작업을 수행할 수 있습니다. 따라서 특정 디렉토리에서 명령줄에서 파일 이름의 중간 부분의 이름을 바꿉니다. 수백 개의 파일이 있을 수 있습니다. 이해가 되셨기를 바랍니다. Ivan에게 감사드립니다.

답변1

쉘을 사용하여 매개변수 확장을 사용하십시오.

for f in *456*; do echo mv -i -- "$f" "${f//456/555}"; done

여기서는 이름에 포함된 파일을 다시 반복하고 456매개변수 확장 모드에서는 ${f//456/555}456사용합니다 555.

mv위의 명령은 실행될 명령을 표시하여 테스트 실행되며, echo작업이 발생하도록 제거할 수 있습니다.

for f in *456*; do mv -i -- "$f" "${f//456/555}"; done

그리고 rename( prename):

rename -n 's/456/555/g' *456*

그러면 파일 이름의 모든 ( g) 456하위 문자열이 555( s/456/555/)로 대체됩니다.

-n시험 실행이 이루어지며 변경 사항이 만족스러우면 제거하여 -n실제 이름 바꾸기를 수행하세요.

rename 's/456/555/g' *456*

답변2

파일을 에 전달하는 것을 잊어버린 것 같습니다 rename.

rename 456 555 *456*

답변3

which -a rename

$PATH에 이름 바꾸기 도구가 있는지 알려줍니다.

rename 's/456/555/g' *

원하는 것을 수행하는 데 선호되는 구문입니다(예:수동). 정규식 이름 바꾸기의 이전 버전이 없거나 이전 버전인 경우다운로드(공식적인) prename 이것은 perl데비안과 다른 시스템에서 사용되는 스크립트입니다.

답변4

(에서 이동됨질문여기에 대한 답변으로 사용됨)

내 질문에 대한 답을 찾았습니다.

#! /bin/csh -f
#----------------------------------------------------------------------
#  Script Name: moveme                          Date:   05/07/96
#  Written by:  John W. Woolsey                 Rev:    10/11/99
#
#  Description:
#    Renames a set of files that contain a particular search string
#    to file names that contain a replacement string.
#
#  Syntax:  moveme <search_string> <replace_string>
#
#  Where:
#     <search_string> is the name of the file name search string.
#     <replace_string> is the name of the file name replace string.
#----------------------------------------------------------------------
#
onintr catch
if ($#argv != 2) goto syntax

ls -d *$1* | sed "s/\(.*\)\$1\(.*\)/mv & \1$2\2/" | sh
exit 0

syntax:
echo "Syntax:  `basename $0` <search_string> <replace_string>"
exit 1

catch:
echo "`basename $0` was interrupted or terminated abnormally."
exit 1

관련 정보