파일 이름을 1에서 무제한으로 자동 변경

파일 이름을 1에서 무제한으로 자동 변경

여러 파일의 이름을 1부터 무한(모든 파일 포함)으로 바꾸는 방법은 무엇입니까?

내 파일은 다음과 같습니다.

file.jpeg.jpg
fileA.jpeg.jpg
fileB.jpeg.jpg

산출:

1.jpeg.jpg
2.jpeg.jpg
3.jpeg.jpg

Cygwin을 사용하고 있어서 패키지를 설치할 수 없습니다

답변1

노력하다:

n=0; for f in *.jpg; do mv "$f" "$((++n)).jpeg.jpg"; done

또는 동일한 내용이 여러 줄에 걸쳐 퍼집니다.

n=0
for f in *.jpg
do
    mv "$f" "$((++n)).jpeg.jpg"
done

어떻게 작동하나요?

  • n=0

    이는 변수 nn을 초기화합니다.

  • for f in *.jpg; do

    그러면 이름이 로 시작하는 현재 디렉터리를 반복하는 루프가 시작됩니다 .jpg.

  • mv "$f" "$((++n)).jpeg.jpg"

    필요에 따라 파일 이름이 변경됩니다. Bash에서는 $((...))산술 연산을 수행합니다. 여기서는 n실행할 때마다 증가하도록 만듭니다 .

  • done

    이는 사이클의 끝을 나타냅니다.

이 코드는 이름에 공백, 탭, 줄 바꿈 또는 기타 어려운 문자가 포함된 파일이 있는 경우에도 작동합니다.

주문하다

glob은 test*.in파일 목록으로 확장됩니다.알파벳순으로주문하다. 이에 대한 문서는 다음과 같습니다 man bash.

bash는 각 단어에서 *, ? 및 [ 문자를 검색합니다. 이러한 문자 중 하나가 나타나면 해당 단어는 패턴으로 간주됩니다. 알파벳순 목록으로 대체됨패턴과 일치하는 파일 이름(아래 패턴 일치 참조) [강조하다. ]

알파벳 순서의 의미는 지역에 따라 다를 수 있습니다.

답변2

j=0;
for i in `ls`
do
     mv $i $j.jpeg.jpg
     j=`echo $j + 1 | bc`
done

답변3

파일 수는 "무제한"일 수 있으므로 명령줄 크기에는 기본적으로 제한이 있습니다. 바라보다https://stackoverflow.com/questions/19354870/bash-command-line-and-input-limit. 그래서 나는 그것을 find문제 해결에 사용할 것입니다. 예를 들어, bash에서는:

cd /path/to/directory
n=1
find . -maxdepth 1 -type f -name "*.jpeg.jpg" | sort |  while read file; do
    mv "$file" $n.jpeg.jpg
    let n=n+1
done

단계는 한 줄씩 다음과 같습니다.

  1. 적절한 디렉토리로 전환
  2. 파일 카운터를 1로 설정
  3. find(현재) 디렉터리 에 .있으며 하위 디렉터리( )로 드릴다운하지 않고 -maxdepth 1일반 파일만 살펴보고 -type f이름이 패턴과 일치하는 파일만 반환하여 *.jpeg.jpg해당 이름을 인쇄합니다(기본적으로). find 명령의 출력을 sort 명령으로 파이프하여 순서대로 정렬합니다(sort는 매우 큰 표준 입력을 처리할 수 있음). 정렬의 출력은 입력의 각 줄을 한 줄씩 변수로 while설정하는 /loop 로 파이프됩니다.readfile
  4. file변수 에 이름이 저장된 파일을 변수 이름의 파일로 이동하고 $n".jpeg.jpg"라는 문자열로 연결합니다.
  5. 변수 n 추가
  6. 다음 파일 이름으로 반복합니다.

이 방법으로 매우 큰 디렉토리를 처리할 수 있습니다. "이상한"(일명 "인쇄 가능한 ASCII 세트에 없는 문자") 파일 이름에 영향을 받지 않습니다. 더 면역성을 갖도록 만들 수 있지만 이 경우에는 필요하지 않을 수도 있습니다(옵션 -print0xargs명령 사용이 포함됨).

답변4

이 버전에서는 새 파일을 알파벳순으로 나열할 때( 출력에 표시됨) 동일한 순서로 유지됩니다 ls.

#!/bin/sh
i=0
for f in *.jpeg.jpg
do
     mv "$f" "$(printf '%011d.jpeg.jpg' $i)"
     i=$(expr $i + 1)
done

관련 정보