여러 파일의 이름을 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
이는 변수
n
n을 초기화합니다.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로 설정
find
(현재) 디렉터리 에.
있으며 하위 디렉터리( )로 드릴다운하지 않고-maxdepth 1
일반 파일만 살펴보고-type f
이름이 패턴과 일치하는 파일만 반환하여*.jpeg.jpg
해당 이름을 인쇄합니다(기본적으로). find 명령의 출력을 sort 명령으로 파이프하여 순서대로 정렬합니다(sort는 매우 큰 표준 입력을 처리할 수 있음). 정렬의 출력은 입력의 각 줄을 한 줄씩 변수로while
설정하는 /loop 로 파이프됩니다.read
file
file
변수 에 이름이 저장된 파일을 변수 이름의 파일로 이동하고$n
".jpeg.jpg"라는 문자열로 연결합니다.- 변수 n 추가
- 다음 파일 이름으로 반복합니다.
이 방법으로 매우 큰 디렉토리를 처리할 수 있습니다. "이상한"(일명 "인쇄 가능한 ASCII 세트에 없는 문자") 파일 이름에 영향을 받지 않습니다. 더 면역성을 갖도록 만들 수 있지만 이 경우에는 필요하지 않을 수도 있습니다(옵션 -print0
및 xargs
명령 사용이 포함됨).
답변4
이 버전에서는 새 파일을 알파벳순으로 나열할 때( 출력에 표시됨) 동일한 순서로 유지됩니다 ls
.
#!/bin/sh
i=0
for f in *.jpeg.jpg
do
mv "$f" "$(printf '%011d.jpeg.jpg' $i)"
i=$(expr $i + 1)
done