JPEG 확장자를 사용하여 파일 이름을 무작위로 지정하는 스크립트가 있습니다.
#!/bin/bash for img in *.jpg; do newname=$(head /dev/urandom | tr -dc a-z0-9 | head -c 8) mv "$img" "$newname".jpg; done
JPEG 파일과 함께 사용하면 이 스크립트는 다음과 같은 파일 이름을 출력합니다.
0cb1v984.jpg dqm2xxoj.jpg o61bg4n5.jpg
그러나 이 bash 스크립트의 ".jpg" 확장자를 ".gif" 또는 ".webp"로 바꾸려고 하면 작동하지 않습니다.
GIF 및 WEBP의 이름을 애니메이션 GIF 및 WEBP로 바꾸려고 하여 문제가 발생한 것입니까?
이상적으로는 이러한 3가지 확장자를 가진 파일의 파일 이름을 무작위로 지정하는 bash 스크립트를 갖고 싶지만 3가지 다른 bash 스크립트를 사용하여 각 확장자의 파일 이름을 무작위로 지정할 수도 있습니다.
나는 최고 등급의 답변을 다루었습니다.이것질문을 했지만 소용이 없었습니다.
답변1
for
확장을 반복하려면 또 다른 루프가 필요합니다 .
for ext in jpg gif webp; do
for img in *.${ext}; do
newname="$(head /dev/urandom | tr -dc a-z0-9 | head -c 8).${ext}"
mv "$img" "$newname"
done
done
그러나 접근 방식에는 몇 가지 문제가 있습니다.
- 확장 시 비효율적 - 무작위 데이터를 일괄 생성하고 한 번에 8자를 가로채는 것이 더 좋습니다.
- 이름 충돌 가능성(가능성은 낮지만 불가능하지는 않음)
/dev/urandom
처음 10개의 "행"에 8개의 영숫자 문자를 제공하지 않을 수도 있습니다 (가능성은 낮지만 불가능하지는 않음)
그러니까 이게 개선된 버전이군요
# give our variables global scope
declare data=''
declare newname
rand() {
# check if data contains the required # of characters...
if [ -z "${data:${1}}" ] ; then
# ...if not, generate 1000 more characters
data="${data}$(tr -dc a-z0-9 < /dev/urandom | head -c 1000)"
fi
# fill the nominated variable with the required number of characters
eval "${2}"="${data:0:${1}}"
# remove the characters just used from the random data
data="${data:${1}}"
}
for ext in jpg gif webp; do
for img in *.${ext}; do
while true ; do
rand 8 newname
# keep getting $newname values until $newname.$ext doesn't exist
[ -e "${newname}.${ext}" ] || break
done
mv "${img}" "${newname}.${ext}"
done
done
내 컴퓨터에서 이 버전은 1500개의 파일을 처리하는 데 약 11초가 걸리는 반면, 덜 효율적인 버전은 약 25초가 걸립니다.