![파일 이름을 바꾸고 각 파일 이름을 묻는 For 루프](https://linux55.com/image/49869/%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EB%B0%94%EA%BE%B8%EA%B3%A0%20%EA%B0%81%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EB%AC%BB%EB%8A%94%20For%20%EB%A3%A8%ED%94%84.png)
한 폴더에 있는 여러 개의 비디오 파일을 변환해야 합니다. 각각의 이름을 바꿔야 하지만 각 파일 이름에 대해 사용자 정의 이름을 쓰라는 메시지를 표시하는 스크립트가 필요합니다. 이것이 내가 지금까지 얻은 것입니다:
먼저 다음 명령을 사용하여 스크립트가 실행하는 파일 이름에서 공백을 제거해야 합니다.
for f in *' '*; do mv "$f" "`echo $f | sed -e 's/ /_/g'`"; done
변환에 필요하지 않기 때문에 파일 확장자를 제거했습니다. 나는 다음 명령을 사용합니다.
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
유지하도록 하려는 경우 ) 다음에서 명령을 변경할 수 있습니다. 위의 루프:.jpg
mv
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
파일 이름을 바꾸는 방법은 정말 지루합니다.