仅查找文件夹

仅查找文件夹

我的硬盘很乱,所以我决定清理一下。作为清理工作的一部分,我想将所有包含音乐的文件夹合并为一个。我想要做的是,在我的硬盘上查找任何 *.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

相关内容