我的硬盘很乱,所以我决定清理一下。作为清理工作的一部分,我想将所有包含音乐的文件夹合并为一个。我想要做的是,在我的硬盘上查找任何 *.mp3 和 *.aac 文件并检索文件夹的名称。然后,我想删除任何重复的文件夹名称,最后一步只抓取根目录。我发现很难准确解释这一点,所以这里有一张示例树的图片:
root1
|--folder1
|--sub1
|--file1.mp3
|--file2.aac
|--sub2
|--sub3
|--file3.mp3
|--file4.aac
|--folder2
| ...contains photos and documents (no mp3/aac)...
root2
|--folder3
|--file4.mp3
|--file5.aac
|--folder4
|--file6.mp3
对于这个例子,我想要的输出是root1/folder1 root2/folder3 root2/folder4
。
由于我对 bash 和 UNIX 工具的了解有限,我不知道该怎么做。有办法实现吗?如果您的解决方案具有 ,我没问题,但如果改用 ,find
那就更好了。locate
答案1
进入每个最终顶层文件夹,并将该文件夹下的所有 .mp3 或 .aac 文件移动到当前文件夹,然后删除现在为空的文件夹,尝试:
for f in root*/folder*; do
cd $f
find -name "*mp3" -exec sh -c "mv {} \$(basename {})" \;
find -name "*aac" -exec sh -c "mv {} \$(basename {})" \;
find -type d -exec rmdir {} \;
cd -
done
您将看到有关尝试 rmdir 非空文件夹的错误,但空文件夹将被删除。
如果您只想知道哪些顶级文件夹包含带有 mp3 或 aac 文件的子文件夹:
find -name "*mp3" -o -name "*aac" | cut -d/ -f1-3 | sort -u
查找所有 .mp3 或 .aac 文件,返回一系列类似“./root2/folder3/file4.mp3”的行。然后,使用 cut 删除路径“./root2/folder3”的前三部分以外的所有内容。最后,使用 sort -u 丢弃所有重复项。
答案2
找到所有以 mp3 或 aac 结尾的文件,用 sed 删除文件名并仅打印每个文件夹的一次出现。
locate --regex '.*(aac|mp3)$' | sed -e 's,/[^/]*$,,' | uniq