Macos 如何按basename比较(在shell脚本中)两个文件,然后丢弃其中一个?

Macos 如何按basename比较(在shell脚本中)两个文件,然后丢弃其中一个?,macos,bash,perl,shell,Macos,Bash,Perl,Shell,我在OSX10.7上使用BashShell。我有很多音频文件目录,如下所示: dir/audio.mp3 dir/audio.m4a 我想以编程方式放弃其中一个文件,但是如何放弃呢?我知道如何获取基本名称: find . -type f -exec basename -a {} + | sort | awk -F"." '{print $1}' | uniq -d 但是我很难理解如何“标记”MP3,比如说,这样rm就可以完成它的任务。理想情况下,我会保留最高比特率的文件,但现在按文件扩展名剪

我在OSX10.7上使用BashShell。我有很多音频文件目录,如下所示:

dir/audio.mp3
dir/audio.m4a
我想以编程方式放弃其中一个文件,但是如何放弃呢?我知道如何获取基本名称:

find . -type f -exec basename -a {} + | sort | awk -F"." '{print $1}' | uniq -d
但是我很难理解如何“标记”MP3,比如说,这样rm就可以完成它的任务。理想情况下,我会保留最高比特率的文件,但现在按文件扩展名剪切就可以了


也许Perl是更好的工具,但我对Perl还不够精通,无法着手解决这个问题。

您可以使用basename命令获取文件的basename,看起来您正在从find anyways执行此步骤…:

$ file="/foo/bar/baz.ext"
$ echo $file
/foo/bar/baz.ext

$ name="$(basename "$file")"
$ echo $name
baz.ext
然后,要删除扩展名,请使用%.*参数展开来去掉最后一个点和以下所有内容:

$ base="${name%.*}"
$ echo $base
baz

man bash,搜索参数展开以获取更多信息。这也适用于ksh/zsh。

您可以使用basename命令获取文件的basename,看起来您正在从find anyways中执行此步骤…:

$ file="/foo/bar/baz.ext"
$ echo $file
/foo/bar/baz.ext

$ name="$(basename "$file")"
$ echo $name
baz.ext
然后,要删除扩展名,请使用%.*参数展开来去掉最后一个点和以下所有内容:

$ base="${name%.*}"
$ echo $base
baz

man bash,搜索参数展开以获取更多信息。这在ksh/zsh中也适用。

在Perl中,您需要的是File::Find模块


注意:实际上并没有删除。那就留给你了。您可能可以使用File::Find进行更巧妙的比较,例如修改时间、文件大小。您甚至会发现,您可以使用类似的模块自动提取MP3元数据。我没用过那个,所以

在Perl中,您需要的是File::Find模块


注意:实际上并没有删除。那就留给你了。您可能可以使用File::Find进行更巧妙的比较,例如修改时间、文件大小。您甚至会发现,您可以使用类似的模块自动提取MP3元数据。我没用过那个,所以

basename一次只接受一个文件。您要放弃哪个文件?当.mp3和.m4a同时存在时,是否总是.mp3?假设,如果两个可能的文件中只有一个具有相同的basename,那么您希望保留它-键入f-名称“*.m4a”| xargs script2delete_mp3(如果存在)。script2delete在哪里。。。只输出文本字符串,如rm dir/audio.mp3,您可以在执行之前查看这些字符串。当所有的输出看起来都很好时,你就可以像find…|xargs…|/bin/bash和shell随后将执行通过管道传递的命令。然后可以制作script2delete。。尽可能智能,如果它找到mp3,它可以确认..m4a具有更高的比特率,但如果没有,输出将是rm dir/audio.m4a。祝你好运。乔纳森,是的,我总是想放弃.mp3版本,但前提是basename与另一个扩展名重复。我还有一些.flac文件,优先考虑。谢谢,Sheller。外壳的管道对我来说是新的;我得调查一下!basename一次只接受一个文件。您要放弃哪个文件?当.mp3和.m4a同时存在时,是否总是.mp3?假设,如果两个可能的文件中只有一个具有相同的basename,那么您希望保留它-键入f-名称“*.m4a”| xargs script2delete_mp3(如果存在)。script2delete在哪里。。。只输出文本字符串,如rm dir/audio.mp3,您可以在执行之前查看这些字符串。当所有的输出看起来都很好时,你就可以像find…|xargs…|/bin/bash和shell随后将执行通过管道传递的命令。然后可以制作script2delete。。尽可能智能,如果它找到mp3,它可以确认..m4a具有更高的比特率,但如果没有,输出将是rm dir/audio.m4a。祝你好运。乔纳森,是的,我总是想放弃.mp3版本,但前提是basename与另一个扩展名重复。我还有一些.flac文件,优先考虑。谢谢,Sheller。外壳的管道对我来说是新的;我得调查一下!参数展开,我总是忘记这一点。谢谢。另外,我认为base=${base%.*}应该是base=${name%.*}。@sqldoug没错,我把名字改成了添加$base,但忘记了那个。更正。参数展开,我一直忘记这个。谢谢。另外,我认为base=${base%.*}应该是base=${name%.*}。@sqldoug没错,我把名字改成了添加$base,但忘记了那个。更正。谢谢,索布里克。这对我来说是很清楚的,即使我掌握了基本的Perl技能。仅仅因为Perl因其难看的意大利面代码而臭名昭著,但这并不意味着你必须遵循潮流::酷才能了解MP3::信息谢谢,Sobrique。这对我来说是很清楚的,即使我掌握了基本的Perl技能。仅仅因为Perl因其难看的意大利面代码而臭名昭著,这并不意味着你也必须遵循潮流::酷来了解MP3::信息