【问题标题】:Bash script to prepend a random number to all filesBash脚本为所有文件添加一个随机数
【发布时间】:2011-03-11 15:47:28
【问题描述】:

我有一部“智能”手机,它似乎没有音乐随机播放功能,所以最好的办法是编写一个 bash 脚本,在当前目录中的所有文件名前面加上一个随机数。

这很难吗?

【问题讨论】:

  • 可能想先通过`printf %05d $RANDOM`-"$i" 运行以下建议

标签: linux bash


【解决方案1】:

我知道这已经很老了,但我刚刚遇到了类似的问题,也许这仍然有用。我刚买了一个便宜但防水的 MP3 播放器来跑步,它运行良好,只是在随机播放模式下,同样的几首歌似乎一直在重复。我在LinuxQuestions.org 上找到了一些说明,我可以根据自己的需要进行修改,所以这是我经过反复试验后得出的结论:

我创建了一个名为 Running 的文件夹,并将我正在运行的播放列表中的所有 MP3 放在那里。 (我将文件夹名称大写,以免意外删除。)

 #!/bin/bash
 mkdir ../running_random
 for fname in *.mp3
 do
         cp "$fname" ../running_random/$RANDOM."$fname".mp3
 done

我从 Running 目录中调用脚本,将新创建的 running_random 目录中的内容复制到我的 MP3 播放器,然后删除 running_random。

【讨论】:

    【解决方案2】:

    这是我博客中将在 OS X 和 linux 上运行的脚本。

    #!/bin/bash
    #
    # FILE: 
    #   prepend_random_num.sh
    # ABOUT: 
    #   Prepends a random number between 1-65000 and an underscore to all files of specified type
    #   Runs on Mac OSX & Linux
    # EXAMPLE: 
    #   $ ls 
    #   a.jpg    b.jpg
    #   $ sh prepend_random_num.sh jpg
    #   $ ls
    #   138_b.jpg    8474_a.jpg    
    
    for file in *.$1
    do
      rand=$(jot -r 1 1 65000 || shuf -i 1-65000 -n 1)
      mv "$file" "$rand"_"$file"
    done
    

    【讨论】:

      【解决方案3】:

      通过这个外壳,您的音乐库将随机播放,在播放完所有歌曲之前不会重复任何歌曲。 播放歌曲的历史记录在文件“.Sh.his”中。 如果您将歌曲添加到音乐库或已经听过库中的所有歌曲,则此历史记录会自动重置,从而生成一个新的随机列表。您可以随时重置历史记录,即删除文件“.Sh.his”。

      #!/bin/bash
      
      #-----------------------------------INFO----------------------------------------------------------
      
      #Through this shell, your music library will be played randomly, without repeating any songs until all have been played. 
      #The history of songs played is recorded in the file "*. Sh.his". 
      #This history is reset automatically if you added a song to the music library or have already heard all the songs of your library, 
      #generating a new random list ever. Whenever you want you can reset the history is deleting the file "*. Sh.his".
      
      #Press "q" to skip song
      #Press "p" to pause song and resume song
      
      #------------------------------CONFIGURATION------------------------------------------------------
      
      #mplayer package needed (For debian/Ubuntu/Mint: "$ apt-get install mplayer")
      
      #Select your music library path (all recursive folders will be included in the .mp3 files search):
      path="/media/Datos/Música/Music/"
      
      #-------------------------------------------------------------------------------------------------
      
      while true
      do
      
      cadena=$(find "$path" -iname '*.mp3')                                   #search media files
      nmedia=$(echo "$cadena" | wc -l)
      
      if [ -f "$0.his" ]                                          #file exist
      then
          value=$(<"$0.his")                                      #read file
      
          if [[ ( $(echo "$value" | sed -n 1p) != $nmedia ) || ( $(echo "$value" | sed -n 2p) == 0 ) ]]   #reset file conditions
          then
              listrand=$(seq 1 $nmedia | shuf)
              index=$nmedia
          else                                                #no reset file conditions
              nmedia=$(echo "$value" | sed -n 1p)
              index=$(echo "$value" | sed -n 2p)
              listrand=$(echo "$value" | sed -n 3p)
              listrand=$(echo "$listrand" | sed s/" "/\\n/g)
          fi  
      
      else                                                    #file not exist
          listrand=$(seq 1 $nmedia | shuf)
          index=$nmedia
      fi
      
      nrand=$(echo "$listrand" | sed -n "$index"p)                                #select random number
      cadena=$(echo "$cadena" | sed -n "$nrand"p)                             #select song with random number
      index=$((index-1))                                          #write file
      echo $nmedia > "$0.his"
      echo $index >> "$0.his"
      echo $listrand >> "$0.his"
      mplayer "$cadena"                                           #play media file
      
      done
      exit 0
      

      【讨论】:

      • 虽然这很有趣,但与问题无关——重命名文件,而不是播放音乐。
      【解决方案4】:

      如果文件已经被洗牌,这个脚本将洗牌并重新洗牌。如果你传递一个-u 的参数,它会打乱文件(移除随机前缀)。

      #!/bin/bash
      for file in *.mp3
      do
          if [[ -d $file ]]
          then
              continue    # skip directories
          fi
          if [[ $file =~ ^1[0-9]{5}9-(.*).mp3$ ]]    # get basename
          then
              name=${BASH_REMATCH[1]}                # of a previously shuffled file
          else
              name=${file%.mp3}                      # of an unshuffled file
          fi
          if [[ $1 != -u ]]
          then
              mv "$file" "1$(printf "%05d" $RANDOM)9-$name.mp3"    # shuffle
          else
              if [[ ! -e "$file.mp3" ]]
              then
                  mv "$file" "$name.mp3"                           # unshuffle
              fi
          fi
      done
      

      它在“1”之后使用固定宽度的五位随机数,后跟“9-”,因此打乱后的文件名格式为:1ddddd9-filename maybe with spaces - and other stuff.1983.mp3

      如果您重新运行脚本,它将通过更改前缀中的随机数来重新排列文件。

      -u 参数将删除 1ddddd9- 前缀。

      该脚本需要 Bash >= 3.2 版。

      【讨论】:

        【解决方案5】:

        不,这并不难做到。但是,它会弄乱您精心制作的文件名,并且可能难以撤消。

        您可以使用$RANDOM 作为 bash 中随机数的简单来源。为您 案例:

        #!/bin/bash
        for file in *; do
          mv "$file" $RANDOM-"$file"
        done
        

        我没有测试这个。您可能想自己在一些小的 示例以确保您知道它的作用。

        【讨论】:

        • 另外,不要在任何给定的文件集上多次运行它,否则它会在前面加上另一个数字。没有什么比拥有“1413-426-234235-2-NeverGonnaGiveYouUp.mp3”更好的了。
        • @cHao:没错。移动文件的整个方法被破坏了。如果他可以在某个特定目录中使用软链接并在完成后将其删除。不确定他的文件系统是否可以做到这一点。
        • 不幸的是,我无法访问链接之类的东西,因为它只是一个 FAT 系统。幸运的是,文件名或多或少没有意义,因为重要的东西在 ID3 标签中。
        • 可以使用例如printf "%06d" $RANDOM 保持随机部分的长度不变。
        • @cHao:实际上,4-8-15-16-23-42-NeverGonnaGiveYouUp.mp3 会更糟;P
        【解决方案6】:

        并不难。比如:

        for i in *; do mv "$i" $RANDOM-"$i"; done
        

        【讨论】:

          猜你喜欢
          • 2014-01-16
          • 1970-01-01
          • 2013-01-15
          • 1970-01-01
          • 2021-03-16
          • 2017-08-03
          • 2017-11-28
          • 1970-01-01
          • 2021-07-11
          相关资源
          最近更新 更多