Vin*_*z M 6 find mp3 directory-structure
我的计算机(Ubuntu 22.04)上有很多包含 MP3 文件的目录,例如在我的/home、/data、 某些分区等中。我想通过移动所有这些目录来重新组合/合并它们(大多数目录的名称都是音乐专辑...) 到一个 MP3 目录中。
我知道向谁查找.mp3文件 ( ),并且我知道如何移动( )find -iname '*.mp3'找到的文件。但是,我不知道如何移动包含找到的数据的目录。find-exec mv
任何想法?
Dan*_*l T 12
您可以使用以下 bash 管道:
find /path/to/src -iname '*.mp3' -type f -printf '%h\0' |
perl -0e 'print sort{length($b)<=>length($a)}keys%{{map {$_,1}<>}}' |
xargs -0 echo mv --backup=t -t /path/to/dst
Run Code Online (Sandbox Code Playgroud)
它执行以下操作:
\0并将-0使用空分隔符而不是换行符来处理奇怪的目录名称。find /path/to/src列出了下面的所有内容src
-iname '*.mp3'扩展过滤.mp3器-type f以某种方式排除具有该扩展名的文件夹-printf '%h\0'获取文件所在的目录perl -0e 'print ...'运行一个脚本:
sort{length($b)<=>length($a)}通过将较长的路径移动到顶部来避免错误,因此子目录会移动到其父目录之前keys%{{map {$_,1}<>}}删除重复项,即当一个目录有两个或多个.mp3文件时xargs获取每个输入行(即目录)并将其作为参数提供给命令
echo您应该在检查这是否符合您的要求后将其删除mv -t /path/to/dst将文件移动到目的地。-t让我们在源文件系统路径之前指定目标目录,以便将xargs路径放在末尾。
--backup=t当不同地方有两个同名目录时,对目录进行编号即使父目录包含.mp3. 如果您(如@PeterCordes)想要更改此行为,只需在 perl 脚本中交换$a和即可。$b这将反转排序,以便首先移动父目录。关于不再存在的父母的剩余错误可以被忽略或通过最后的 来消除2>/dev/null。感谢@Raffa 提供的许多改进。
./src
./src/a
./src/a/a
./src/a/a/a
./src/a/a/a/a.mp3
./src/a/a.mp3
./src/d
./src/d/other.txt
./src/helloworld
./src/helloworld/c.mp3
./dst
Run Code Online (Sandbox Code Playgroud)
./src
./src/d
./src/d/other.txt
./dst
./dst/a
./dst/a/a
./dst/a/a.mp3
./dst/a.~1~
./dst/a.~1~/a.mp3
./dst/helloworld
./dst/helloworld/c.mp3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
476 次 |
| 最近记录: |