【问题标题】:Bash script for moving files and their parent directory用于移动文件及其父目录的 Bash 脚本
【发布时间】:2016-03-28 23:19:20
【问题描述】:

我已经搜索过很多主题,围绕着我想要完成的事情展开。我有超过 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 用 M4A 替换 MP3。从 dir.sh 中删除此示例中的 song.m4a 将为我留下一个 Artist/Album 目录列表,以通过 mkdir 运行 while 循环:/home/me/Music/M4A/Metallica/Re-load/Metallica - The Unforgiven.m4a。不幸的是,这就是我被卡住的地方, dirname 产生一个'。'

【问题讨论】:

  • 看看这里格式化你的问题:stackoverflow.com/editing-help
  • 如果您包含解决问题的最佳尝试,它将更符合 StackOverflow 理念。通常,使用小型测试测试,并使用echo mv .... 直到您的目录名称正确。或者可能是cd .../MP3; find . -name '*.m4a' | xargs mv {} ../M4A(在提前制作了 M4A 目录之后)。祝你好运。
  • 谢谢。我不确定发布失败的脚本是否合适。我尝试了很多不同的方法,它会在这里占用很多空间。我很高兴这个方向。
  • @Ergo :始终适当(并且礼貌(和预期);-) )发布您的代码。口头描述通常是模棱两可的,容易引起误解和相互矛盾的解释。包括小样本数据、所需输出、当前代码、输出和错误消息消除了大多数关于描述问题的问题。是有根据的!祝你好运。

标签: linux bash shell


【解决方案1】:
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

【讨论】:

  • 经过一些研究,我相信 sed 是可行的方法,但上面的代码与我的 mv 脚本有同样的问题......父目录和祖父目录没有被移动/创建。上面的代码的本质是在歌曲的末尾用一个额外的“MP4”重命名文件,并且永远不会移动到任何地方。因为我错过了使用目录的关键元素,所以循环虽然是个好主意,但目前还不能使用。如果我想出解决方案,我会再研究一下“sed”并发布。
  • 假设您的部分问题是由于文件和目录名称中的空格造成的。请务必引用任何 "$dir""$file" 变量的所有用法。祝你好运。
猜你喜欢
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2012-05-19
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多