好吧,这听起来像是一个奇怪的请求,但它确实有一个很好的目的!我有一台带 SD 卡插槽的松下等离子电视,通过它我可以显示 JPEG 照片的幻灯片。这对于防止烧屏很有用,如果我在做饭时离开电视片刻,或者如果我接电话,或者其他什么,只需开始幻灯片放映即可防止出现静态图像,并且在我做其他事情的时候也让我看看照片。
问题是幻灯片总是按字母顺序从第一张照片开始,这意味着我总是看到相同的图像并且永远不会结束。我想做的是在我的 Unix 机器上有一个脚本,我可以在 SD 卡上运行/media/sdcard它(安装在),并让它随机化该目录下所有文件的名称。不会真的不管它是如何随机化他们,但我更喜欢纯数字名称(原因不明)
有没有简单的方法来实现这一点?像find /media/sdcard -exec mv {} rand() \;什么?
对于奖励积分,有什么方法可以防止脚本在发生冲突时覆盖两个文件?这些是照片的副本,所以如果我丢失了一张我仍然有原件,但这仍然不方便......
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
Run Code Online (Sandbox Code Playgroud)
替换mv为ln或ln -s并且可能替换为您认为合适的不同目标目录。请注意,由于find在运行时可能仍在遍历目录mv,因此您不应重命名或链接同一目录中的文件。
shuf特定于 GNU coreutils,其余的是 POSIX。如果您不在 Linux 或 Cygwin 上,请参阅awk或Perl 中的替代方案。