特定のディレクトリでファイル名をランダムに指定するには?

特定のディレクトリでファイル名をランダムに指定するには?

さて、奇妙な要求のように聞こえるかもしれませんが、本当に良い目的に役立ちます! JPEG写真のスライドショーを表示できるSDカードスロット付きのパナソニックプラズマテレビがあります。これは画面のやけどを防ぐのに便利です。料理中にしばらくテレビを離れたり、通話中にスライドショーを開始したりすると、静的画像が表示されないようにするのが便利です。そして、写真を見るとずっと別のことをするようになります。

問題は、スライドショーが常にアルファベット順の最初の写真から始まるということです。つまり、常に同じ画像が見えて終わらないことを意味します。私がやりたいことは、私の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 を使用していない場合は、代替を参照してください。アッまたは真珠

おすすめ記事