파일 이름 시작 부분에서 점과 공백을 제거하는 방법

파일 이름 시작 부분에서 점과 공백을 제거하는 방법

시작 부분에 점과 공백이 있고 끝에 점이 누락된 jpg 파일을 변경하려고 합니다( 아래 . Startjpg그림 참조 ).Start.jpg

요점은 파일을 숨기고 sed해당 ls -al파일을 나열하므로 ls -al온라인 sed에서 많은 설명서를 읽었지만 항상 이 오류가 발생합니다.

sed: -e expression #1, char 6: unknown command: `/'

나는 노력했다

ls -al | sed -r '/^\./*.*/g'
ls -al | sed -r '/^\.//g'
ls -al | sed -r '/.*/[\.]g'
ls -al | sed 's/^\./\\1*./g'

더 많은 것이 있습니다.

또한 filejpg를 file.jpg로 변경해야 합니다.

답변1

Perl rename도구 사용(Debian 및 Ubuntu를 포함한 친구들에서는 이 도구라고 하며 다른 곳에 rename있을 수도 있음 prename):

rename -n 's/(?<!\.)jpg$/.jpg/' *  # -n makes it show you what it'll do,
                                   # but not actually do it. Remove the -n to
                                   # actually rename

이 패턴을 분석해 보겠습니다. jpg$이는 "'jpg'로 끝남"을 의미합니다. (?<!\.)"'jpg' 앞에 점이 없음"을 의미합니다 . 이것은 당신이 어리석은 일 이 foo.jpg되는 것을 막을 것입니다 .foo..jpg

*일반 쉘 와일드카드 로 rename이름 바꾸기를 고려할 파일 목록을 얻습니다. 당신은 확실히 이것을 할 수 있고 /path/to/dir/*, 파일 이름 목록을 전달하고, find다른 것들 과 결합할 수 있습니다.

처음부터 점과 공백을 제거하는 것도 매우 쉽습니다.

rename -n 's/^[. ]+//' *          # trying -n first is good practice

그러면 모든 선행 점과 공백이 제거됩니다. 될 것 . . . foo입니다 foo.

일반적으로 *쉘 확장은 이름이 점으로 시작하는 파일(숨겨진 파일)을 생성하지 않습니다. 한 가지 옵션은 을 사용하는 것입니다 .*. 이렇게 하면 두 개의 특수 항목 .(현재 디렉터리)과 ..(상위 디렉터리)도 생성됩니다. 이 경우에는 해가 없습니다. 첫 번째 명령은 이를 무시합니다( 로 끝나지 않음 jpg). 두 번째 명령은 이름을 바꾸려고 시도하지만 오류가 발생합니다. 또 다른 옵션은 다음을 찾는 것입니다.

find -type f -exec rename -n 's/^[. ]+//' '{}' +

-type f파일로 제한됩니다. 물론, find의 다른 옵션을 사용할 수도 있습니다.

답변2

sed매우 유용하고 다양한 도구임에도 불구하고 올바르게 사용하고 있지 않습니다. 텍스트 파일의 문자열을 일치시키고 바꾸는 데 가장 적합합니다. 파일 시스템에서 파일 이름을 직접 바꿀 수는 없습니다.

이 작업은 bash 단일 라이너에 더 적합합니다(쉘이라고 가정). . filejpg와 같은 이름 을 바꾸려면 file.jpg다음 명령을 사용하십시오.

find . -name '. *' -print0 | while read -d $'\0' file; do short_file=${file%jpg}.jpg; mv "$file" "${short_file:4}"; done

설명하다

find특정 파일 속성(이 경우 파일 이름)과 일치하는 파일 경로를 반환하는 프로그램입니다. 현재 경로의 하위 디렉터리에 어떤 .jpg 파일이 있는지 알고 싶다면 다음을 수행할 수 있습니다 find . -name "*.jpg". 일반적으로 이는 각 파일을 새 줄에 출력합니다. 이로 -print0인해 일치 항목이 null 문자로 구분됩니다. 이를 통해 출력을 다음 명령으로 전달할 때 공백이 있는 파일 이름을 올바르게 처리할 수 있습니다.

|역할을 도관이라고 합니다. 이는 쉘에게 왼쪽 명령의 출력을 가져와서 오른쪽 명령(이 경우 read루프 내부 명령) 에 입력으로 전달하도록 지시합니다 while.

read명령은 출력을 가져와 find변수에 할당하는 데 사용됩니다 file. 일반적으로 이는 file각 단어에 한 번에 값을 할당하지만 -d $'\0'$할당은 널 문자로 구분됩니다( 플래그를 find사용하여 파일을 구분하는 -print0방법과 일치 ).

while 루프를 사용하면 read"file"에 일치하는 각 파일 이름에 대한 값이 반복적으로 할당됩니다. while 루프에 대한 표준 bash 구문의 일부 do입니다 .done

while <something is true>; do
    <run some commands>
done

이 경우 "일부 명령 실행"은 먼저 파일 이름의 확장자를 수정하고 이를 새 변수에 할당합니다 . short_file=${file%jpg}.jpg그런 다음 파일 이름을 바꾸고 수정된 파일 이름의 시작 부분에서 확장자를 제거합니다 . . filejpg. file.jpgmv.mv "$file" ${short_file:2}

답변3

다른 답변 대신 그래픽 도구를 사용할 수 있습니다.GP 이름 바꾸기. 문자 바꾸기, 파일 이름 자르기 등을 수행할 수 있습니다. 장점은 이름을 바꾸기 전에 새 파일 이름을 확인할 수 있는 미리보기 기능이 내장되어 있다는 것입니다. 하지만 한 번에 하나의 디렉터리에서만 작동할 수 있기 때문에 하위 폴더 내의 여러 폴더에서 사용하는 것은 불편할 수 있습니다. 하지만 폴더가 10개 미만인 경우에는 문제가 되지 않습니다.

관련 정보