如何仅移动文件夹中其他文件名相同但扩展名不同的文件

如何仅移动文件夹中其他文件名相同但扩展名不同的文件

我有很多文件夹,有些只包含 mp3 文件,有些只包含 m4a 文件,还有一些包含两种扩展名的文件。

我需要确定哪些文件夹包含两种扩展名的文件,然后将 mp3 文件移动到另一个文件夹,只保留 m4a 文件。如果文件夹中有一些文件不包含两种扩展名,则不会发生任何事情。

我已经探索 shell 一段时间了,但我还远不能做到这样。如果我有任何进展,我会在这里更新。

答案1

如果我理解正确的话,那么你只需要搜索.mp3文件并移动那些.m4a在同一目录中存在等效文件的文件。以下bash脚本将执行此操作,但它不会找到存在于不同目录中的重复 MP3/M4A 文件对。请注意,正确引用变量非常重要,因为音乐文件的名称中通常有很多空格,并将bash空格解释为列表中的分隔项。

#!/bin/bash

# Name of directory under which you music is stored.
SOURCE_DIR=/path/to/current/music/dir

# Name of directory you want to move the MP3s to.
DEST_DIR=/path/to/mp3/destination/dir

# Create the destination directory for the moved MP3s, if it doesn't already exist.
[ ! -d $DEST_DIR ] && mkdir -p $DEST_DIR

# Search for .mp3 files starting in $SOURCE_DIR
find $SOURCE_DIR -type f -name "*.mp3" | while read fin
do

  # Create the equivalent file name with .m4a extension.
  fm4a=${fin/.mp3/.m4a}

  # If a file with .m4a extension exists, move the .mp3 file to the destination dir.
  # In the event of a file name clash in the destination dir, the incoming file has
  # a number appended to its name to prevent overwritng of the existing files.
  [ -f "$fm4a" ] && mv -v --backup=numbered "$fin" $DEST_DIR/
done

##
## End of script.
##

在运行该版本之前,我建议将之前的行替换done为以下行,作为一种试运行,以便您了解将要移动的内容:

  [ -f "$fm4a" ] && echo "Moving $fin to $DEST_DIR/"

(提示评论纠正我对find和 的危险使用while。)

答案2

mv 将发出一些文件未找到错误,但这应该可以工作

ls -1 *.m4a | sed 's#\(.*\).m4a#mv \1.mp3 otherdir#' | sh

答案3

我想不出在 shell 中实现此操作的方法;即使可以,与程序所能实现的功能相比,它也非常有限。我确信重复清理器 (digital volcano) 可以搜索音乐文件并将任何重复的 mp3 版本移至其他地方。它也可以进行模糊匹配。 http://download.cnet.com/Duplicate-Cleaner/3000-2248_4-10584403.html?part=dl-&subj=dl&tag=button 安装时观看广告软件...

答案4

此解决方案已在 GNU/Linux 系统的 /bin/bash 上进行了测试。我假设您的 Mac 有一个 /bin/bash,以及 awk、tr、grep、ls、rm 和 wc。(/bin/bash 是默认的 shell 可执行文件)。此脚本还假设您只有 mp3 和 m4a 文件,并且某些目录不包含 mp3 和 m4a 文件。(在

再次,假设 Mac 具有 bash、tr、grep、ls、rm 和 wc(标准 UNIX 实用程序,如果我没记错的话)

(抱歉,我的脚本编写习惯不好,我不太擅长编写 shell 脚本)

(目录 = 文件夹)

(使用第一个参数指定目标目录)(即 ./thisscript.sh 目录名)

(在执行此操作之前,请先阅读整个帖子)

在所有包含音乐的目录的父目录中创建一个文本文件并将其粘贴到: http://pastebin.com/HcAvWtG0 现在在 shell 中导航到该目录并输入:

bash <filename>

请注意,如果没有脚本,您就无法完成如此复杂的事情。;)

带你经历这个过程:

#!/bin/bash

告诉我们使用 /bin/bash,即 shell。

todir=$1

将第一个参数解析为目标目录并将其存储在 $todir (一个变量)中。

cd $( dirname $0 )

为了确保安全,我们可以从任何目录执行脚本,只要脚本与所有音乐目录位于同一目录中。

DIRLIST=$( ls -F | grep '/' | tr -d '/' )

列出目录。

for DIR in $DIRLIST
do

迭代目录。

    mp3num=$( ls $DIR | grep -c \\.mp3 )
    m4anum=$( ls $DIR | grep -c \\.m4a )
    filnum=$( ls $DIR | wc -l )

存储我们需要的一些变量(mp3 的数量、m4a 的数量、文件的数量

    echo $DIR $mp3num $mp4num $filnum

(仅用于调试)

    if [ $DIR = $todir ]; then
        continue
    fi

如果我们正在查看当前迭代中的目录,请跳过它。

    if [ $m4anum = 0 -o $mp3num = 0 ]
    then
        continue

如果目录没有 m4a 或 mp3,则跳过它。

    elif [ $mp3num != 0 -a $m4anum != 0 ]
    then
        mv $DIR/*.mp3 $todir

如果目录中有一些 mp3 和一些 m4a,则将目录中的所有 mp3 移动到指定的目标目录。

    fi
done

我们完成了。

之所以这在 Mac 上也能正常工作,是因为 Mac 是基于 Unix 的。它们还具有 bash(我们在这里使用的 shell 语言)以及所有那些小型 Unix 实用程序(我查找了它们,它们出现在 Mac Manpages 的第一个结果中。)

另外,请确保目标目录存在,否则它将不起作用......

相关内容