【问题标题】:Shell Script for renaming and relocating the files用于重命名和重定位文件的 Shell 脚本
【发布时间】:2011-04-20 16:01:24
【问题描述】:

我正在做一些事情,需要解决以下问题。我给出了我的问题的类似版本。

假设我们有一个音乐目录,其中有 200 个目录对应不同的电影。在每个电影目录中都有一些音乐文件。

现在,假设文件 music.mp3 在文件夹 movie.mp3 中。我想制作一个 shell 脚本,以便将文件重命名为 movie_music.mp3 并将其放在我提到的某个文件夹中。基本上,子目录中的所有文件都将被重命名并放入新目录中。

有什么解决方法吗?

【问题讨论】:

    标签: linux file shell directory


    【解决方案1】:

    此脚本接收两个参数:源文件夹和目标文件夹。它将源目录下任何目录下的每个文件移动到具有新文件名的新目录:

    #!/bin.sh
    echo "Moving from $1 to $2"
    for dir in "$1"/*; do
      if [ -d "$dir" ]; then
        for file in "$dir"/*; do
          if [ -f "$file" ]; then
            echo "${file} -> $2/`basename "$dir"`_`basename "${file}"`"
            mv "${file}" "$2"/`basename "$dir"`_`basename "${file}"`
          fi
        done
      fi
    done
    

    这是一个示例:

    bash move.sh dir dir2 从 dir 移动到 dir2 目录/d1/f1 -> 目录2/d1_f1 目录/d1/f2 -> 目录2/d1_f2 目录/d2/f1 -> 目录2/d2_f1 目录/d2/f2 -> 目录2/d2_f2

    【讨论】:

    • 在目录名和文件名中是否也能容纳空格
    • 脚本给了我以下错误:songs/ZINDA/Kabhi Muskura Ke.mp3 -> test/ZINDA_Kabhi Muskura Ke.mp3 mv: target `Ke.mp3' is not a directory
    • 不,它在空格处中断,因为 basename 没有被正确引用。更正确的是mv -v -- "$file" "$2/$(basename -- "$dir")_$(basename -- "$file")" 或类似的东西
    【解决方案2】:

    重击:

    newdir=path/to/new_directory;
    find . -type d |while read d; do
      find "$d" -type f -maxdepth 1 |while read f; do
        movie="$(basename "$d" |sed 's/\(\..*\)\?//')"
        mv "$f" "$newdir/$movie_$(basename $f)";
      done;
    done
    

    【讨论】:

    • 文件是 mp3 没有限制。它们可以是任何媒体类型,如 wav、mpg.. 等。
    • @abhishekgupta92 我更新了脚本以查找当前目录下每个目录中的所有文件,并将它们移动到$newdir。您必须注意,如果将所有这些文件移动到一个目录中,您将面临丢失文件的风险。您可以通过重命名文件(例如,s/\//_-_/g)将风险降至最低,但这并不能消除风险。
    【解决方案3】:

    假设如下目录树:

    ./movie1:
    movie1.mp3
    
    ./movie2:
    movie2.mp3
    

    以下单行代码将创建您可以使用的“mv”命令:

    find ./ | grep "movie.*/" | awk '{print "mv "$1" "$1}' | sed 's/\(.*\)\//\1_/'
    

    编辑:

    如果您的目录结构仅包含相关目录,则可以使用以下 grep 扩展:

    grep "\/.*\/.*"
    

    请注意,它看起来至少包含一个目录和一个文件的文件。如果你有多个内部目录,那就不够了。

    【讨论】:

    • no der 一点也不像电影 1 .. 说一部名为蜘蛛侠的电影,另一部名为泰坦尼克号的电影。
    • 它没有处理文件中的空格。也许首先重命名文件以删除空格并用破折号替换它们应该会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2016-03-14
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多