특정 디렉토리에서 파일 이름을 무작위로 지정하는 방법은 무엇입니까?

특정 디렉토리에서 파일 이름을 무작위로 지정하는 방법은 무엇입니까?

좋아요, 이상한 요청처럼 들릴 수도 있지만 정말 좋은 목적에 도움이 됩니다! 나는 JPEG 사진의 슬라이드쇼를 표시할 수 있는 SD 카드 슬롯이 있는 Panasonic 플라즈마 TV를 가지고 있습니다. 이것은 화면 화상을 방지하는 데 유용합니다. 요리하는 동안 잠시 TV에서 물러나거나 통화 중일 때 슬라이드쇼를 시작하면 정적 이미지가 나타나지 않도록 하는 것이 편리합니다. 그리고 사진을 볼 때 계속 다른 일을 하게 됩니다.

문제는 슬라이드쇼가 항상 알파벳 순서의 첫 번째 사진부터 시작한다는 것입니다. 즉, 항상 같은 이미지가 보이고 끝나지 않는다는 뜻입니다. 내가 하고 싶은 것은 내 Unix 컴퓨터에 /media/sdcardSD 카드(내가 설치한)에서 실행할 수 있는 스크립트를 두고 해당 디렉터리에 있는 모든 파일의 이름을 무작위로 지정하도록 하는 것입니다. 아니요진짜어떻게 무작위로 지정하는지는 중요하지 않습니다. 하지만 그렇게 할 것입니다.선호하다순수한 숫자 이름(명백한 이유 없음)

이것을 달성하는 쉬운 방법이 있습니까? 그것은 마치 find /media/sdcard -exec mv {} rand() \;?

보너스 포인트를 얻으려면 스크립트를 차단하는 방법씌우다두 파일이 충돌하면 어떻게 되나요? 사진의 복사본이라 잃어버리면 원본은 남겠지만 그래도 불편할 것 같아요...

답변1

find . -type f |
shuf |  # shuffle the input lines, i.e. apply a random permutation
nl -n rz |  # add line numbers 000001, …
while read -r number name; do
  ext=${name##*/}  # try to retain the file name extension
  case $ext in
    *.*) ext=.${ext##*.};;
    *) ext=;;
  esac
  mv "$name" "../randomized/${name%/*}/$number$ext"
done

적합하다고 판단되는 경우 또는 다른 대상 디렉토리 mv로 바꾸십시오 . 런타임이 여전히 디렉터리를 순회할 수 있으므로 동일한 디렉터리 내의 파일 이름을 바꾸거나 파일을 연결해서는 안 됩니다.lnln -sfindmv

shufGNU coreutils에만 해당되며 나머지는 POSIX입니다. Linux 또는 Cygwin을 사용하지 않는 경우 대안을 참조하세요.또는진주.

답변2

여기에는 유닉스와 관련된 것이 없습니다 ...

import random, os

input_path = "/home/badp/Youtube/" #absolute path for simplicity
output_path = "./playlist"
files = os.listdir(input_path) #assume all files in the same folder for simplicity
random.shuffle(files)

os.mkdir(output_path)
os.chdir(output_path)
i = 0 
for filename in files:
  os.link( os.path.join(input_path, filename),
           str(i) + filename[filename.rfind(os.path.extsep):]
         )         #↑ there must be something cleaner than this :)
  i += 1

폴더가 있으면 문제가 발생 input_path하지만(하드 링크할 수 없음) 다음의 도움으로 파일 "검색" 논리를 더 강력한 것(재귀 검색 등)으로 쉽게 다시 작성할 수 있습니다.os.path그리고os.walk.

답변3

허용되는 답변과 또 다른 좋은 답변이 있습니다. 어쨌든, 여기에 내가 사용한 스크립트가 있습니다. 전체 경로에서 계산된 해시 시퀀스로 이름을 변경하여 이름을 무작위로 지정합니다. 전체 경로는 각 시스템마다 고유하기 때문에 파일 이름이 충돌하지 않습니다(완전한 것은 아니며 확인을 추가하는 것이 쉽지만 귀찮게 하지 않았습니다). 스크립트는 반복적으로 파일 이름을 바꾸지만 디렉터리 이름은 변경되지 않은 상태로 둡니다. 재귀적 이름 바꾸기를 적용할 폴더를 인수로 전달하여 사용합니다.

#! /bin/bash                                                                                                                                             

do_rename() {
    (
    export prevdir="$(pwd)"
    cd "$1"
    for file in *
    do
        if [ -d "$file" ]
        then
            echo "$file is a directory, renaming recursively"
            do_rename "$file"
        elif [ -f "$file" ]
        then
            dirpath="$prevdir/$1"
            oldname="$dirpath/$file"
            name_hash=$(echo "$oldname" | md5sum)
            newname="$dirpath/${name_hash:0:32}.jpg"
            echo "mv $oldname $newname"
            mv $oldname $newname
        fi
    done
    cd "$prevdir"
    )
}

do_rename "$1"

관련 정보