중복 없이 파일 이름을 무작위로 변경

중복 없이 파일 이름을 무작위로 변경

파일 이름이 많은 폴더가 있는데 그중 일부는 정말 이상하고 의미가 없어서 이름을 다음으로 바꾸고 싶다고 가정해 보겠습니다.

File-1
File-2
File-3
..

나는 이것을 시도했습니다 (에코는 tryng를 위한 것입니다)

for name in *; do echo mv $name File-`echo $(( RANDOM % (10 - 5 + 1 ) + 1 ))`;done

근데 중복 많이 줘

mv bio1 file-3
mv memory23 file-1
mv mernad file-3
mv nio2 file-4
mv nun3 file-4

답변1

shuf(GNU coreutils 패키지에서)를 사용할 수도 있습니다 .준비단일 무작위 샘플 대신 - 다음과 같습니다.

for f in *; do read i; echo mv -- "$f" "file-$i"; done < <(shuf -i 1-10)

또는 (아마도 더 나을 것입니다) 셔플파일 이름-그런 다음 순서대로 이름을 바꾸십시오.

i=1; shuf -z -e -- * | while IFS= read -rd '' f; do echo mv -- "$f" "File-$((i++))"; done

답변2

pre=file ;
for old in * ;
 do new=`xxd -l 16 -ps /dev/urandom` ;
 while [ -f "$pre-$new" ] ; do new=`xxd -l 16 -ps /dev/urandom` ; done ;
 mv "$old" "$pre-$new" ;
done ;

xxd일반적으로 package.json이 포함된 바이너리 파일입니다 vim-common.

xxd -엘속성은 원하는 임의의 길이를 나타냅니다.

xxd -추신포스트스크립트 순수 16진수 덤프 스타일 이름을 가져오는 것입니다(예: a4c794f3861f5d3e36ca9b0afd15ceab).

/dev/urandomLinux 커널 의사 난수 생성기가 있습니까? 그렇지 않은 경우 다음과 같이 작성하십시오.mknod -m 444 /dev/urandom c 1 9

while [ -f "$pre-$new" ]명령보장하다, 같은 이름의 다른 파일이 없습니다.

이 명령은 일반적으로 패키지 [에 포함되어 있습니다 .coreutils

변수는 pre이름 접두어로 선택됩니다. 접두어를 원하지 않으면 공백으로 남겨둘 수 있습니다.pre= ;

예를 들어:

file 1
file 2
file 3
file 4
file 5

이 되다 pre=file:

file-062b9bcde91f1c56084956d175cfdfa3
file-3e7ec1bd5324a485a3402b106d320f73
file-648cf4550c70b2531350f231670fc982
file-074b2828b004f45581784ff1705c7ff3
file-481be2bb21f4b1e637293ae0ecf14f74

답변3

중복된 값이 무작위로 반환될 수 있습니다. 순차적으로 숫자를 생성하는 것은 어떻습니까?

count=0
for name in *; do count=`expr $count + 1` ; echo mv $name File-$count;done

답변4

파일 이름을 순서대로 지정하려면(예: File-1 -> File-n) 순차적으로 수행해야 합니다. --

count=0; for i in * ; do mv $i file-${count}; ((count++)); done 

관련 정보