我有很多文件夹,有些只包含 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 的第一个结果中。)
另外,请确保目标目录存在,否则它将不起作用......