파일 이름을 바꾸고 각 파일 이름을 묻는 For 루프

파일 이름을 바꾸고 각 파일 이름을 묻는 For 루프

한 폴더에 있는 여러 개의 비디오 파일을 변환해야 합니다. 각각의 이름을 바꿔야 하지만 각 파일 이름에 대해 사용자 정의 이름을 쓰라는 메시지를 표시하는 스크립트가 필요합니다. 이것이 내가 지금까지 얻은 것입니다:

  1. 먼저 다음 명령을 사용하여 스크립트가 실행하는 파일 이름에서 공백을 제거해야 합니다.

    for f in *' '*; do mv "$f" "`echo $f | sed -e 's/ /_/g'`"; done
    
  2. 변환에 필요하지 않기 때문에 파일 확장자를 제거했습니다. 나는 다음 명령을 사용합니다.

    for x in *; do mv $x $(echo ${x%*.*}); done
    

그런 다음 패턴의 각 파일 이름을 바꾸려면 for 루프가 필요합니다.

for i in * ; do mv $i $customname; done

$customname문제는 그 단계에서 각 파일의 변수에 어떤 이름을 추가할지 묻는 스크립트가 필요하다는 것입니다 . 이 같은:

Rename file1 to:
.......

Rename file2 to:
.......

답변1

read아래와 같이 STDIN에서 한 줄을 읽으 십시오 .

for FILE in *; do
    echo "Rename '$FILE' to:"
    read NAME
    mv "$FILE" "$NAME"
done

이 예에서는 완료 시 중단하려면 Ctrl-C를 눌러야 하지만 if이름을 입력하지 않은 경우와 같은 추가 상황을 추가하여 중단할 수 있습니다.

편집하다:모든 대상 파일이 원본 파일과 동일한 파일 확장자를 가지기를 원하는 경우(예를 들어, 파일이 호출되고 이름이 바뀐 파일이 수동으로 입력하지 않고도 끝을 pogo.jpg유지하도록 하려는 경우 ) 다음에서 명령을 변경할 수 있습니다. 위의 루프:.jpgmv

mv "$FILE" "$NAME.${FILE##*.}"

${FILE##*.}위 문자열의 내용은 다음을 의미합니다.

  • ${FILE...}변수를 표시 $FILE하지만...
  • ##일치하는 가장 긴 문자열을 처음부터 제거합니다( #가장 짧은 문자열만 일치).
  • *0개 이상의 문자와 일치합니다.
  • .리터럴 기간 일치

전체 표현식( *.)은 일치하는 경우에만 제거됩니다. 따라서 원래 파일 이름에 마침표가 없으면 이상한 결과를 얻게 되며 새 파일 이름은 가 됩니다 NEWNAME.OLDNAME.

답변2

이것은 TV 쇼에서 이름을 가져오는 스크립트를 작성하기 전에 USB-PVR에 사용했던 것입니다...

#!/bin/bash

for f in "$@"
do
    echo Playing "$f"...
    mplayer "$f"
    echo That was "$f".
    read -p "New name? " newname

    if [ "$newname" != "" ]
    then
        mv -v -i "$f" PVR-"$newname".mkv
    fi

    sleep 1
done

파일 이름을 바꾸는 방법은 정말 지루합니다.

관련 정보