linux - 用于移动文件及其父目录的 Bash 脚本

标签 linux bash shell

我进行了搜索,很多主题都围绕着我要完成的目标展开。我有超过 2,000 个 m4a 文件和 17,000 个 mp3。目录结构为/home/me/Music/MP3/Artist/Album/song.m4a。我想使用“查找”来发现 m4a 歌曲,将它们及其专辑目录和艺术家目录移动到 /home/me/Music/M4A/Artist/Album/song。 m4a。我使用 mv -exec 开关不成功,使用 basename 和/或 dirname 创建脚本也不成功。父目录和祖父目录让我丢了。移动文件本身不是问题,只需创建目录结构 移动文件即可。在零碎的努力中,我导出了文件列表 find/home/me/Music/MP3 -name "*.m4a">> dir.sh (部分原因是我想查看文件位置和# 歌曲)。然后我运行 sed 's/MP3/M4A/g' dir.sh 将 MP3 替换为 M4A。从 dir.sh 中删除 song.m4a 将给我留下一个 Artist/Album 目录列表,以使用 mkdir 运行 while 循环:/home/me/Music/M4A/Metallica/Re-load/Metallica - The Unforgiven.m4a.不幸的是,这就是我被卡住的地方,dirname 产生一个 '.'

最佳答案

find /home/me/Music/MP3 -name \*.m4a| sed -e 's/.*/mkdir -p $(dirname "&"); mv "&" "&"M4A;/' | sed -e 's/MP3\([^"]*\)"M4A$/M4A\1"/' > moveit_baby.sh
bash moveit_baby.sh

应该完成这项工作,但在调用之前检查“moveit_baby.sh”。

根据您的 sed 实现,您将需要在第二个 sed 中使用 \(\) 或普通的 ()当然,字符串 "MP3" 不应是艺术家、专辑或歌曲名称的一部分,否则您需要更复杂的过滤器,请参见下文。

只有当目录名发生变化时,您才可以在插入 mkdir -p 时进一步优化。使用 while read 循环

可以更好地实现对输入参数的这种更复杂的决策
find /home/me/Music/MP3 -name \*.m4a | while read file
do
    # do anything you want to $file here
done

关于linux - 用于移动文件及其父目录的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36272825/

相关文章:

linux - 运行动态链接的 ARM 可执行文件时出现 "No such file or directory"错误

regex - 将字符串替换为星号 bash

reactjs - Yarn 可以列出所有可用的脚本吗?

bash - cli和jq,如何获取使用unique_by过滤后的属性值

bash - 为什么 ZSH 卡在空重定向上?

linux - 并行运行命令,如果任何命令使用等待失败,则运行失败

linux - 使用 shell 命令从 yum 命令历史记录中检索补丁名称

python - 使用 python 删除 .dat 文件中的行和列

c++ - 连续调用 mmap,有缓存吗?

linux - 在 bash 脚本中设置日期