移动包含扩展名的文件的文件夹

移动包含扩展名的文件的文件夹

文件夹结构示例:

➜  test tree
.
├── testflac1
│   ├── track1.flac
│   ├── track2.flac
│   └── track3.flac
├── testflac2
│   ├── track1.flac
│   ├── track2.flac
│   └── track3.flac
├── testflac3
│   ├── track1.flac
│   ├── track2.flac
│   └── track3.flac
├── testmp31
│   ├── track1.mp3
│   ├── track2.mp3
│   └── track3.mp3
├── testmp32
│   ├── track1.mp3
│   ├── track2.mp3
│   └── track3.mp3
└── testmp33
    ├── track1.mp3
    ├── track2.mp3
    └── track3.mp3

目标是将包含一个扩展名的文件夹移动到一个目录,例如将~/test [FLAC]包含扩展名的其他文件夹移动mp3~/test [MP3]。我尝试使用 来执行此操作find,但这只允许我自己移动文件,而不保留文件夹结构。

答案1

尝试:

shopt -s nullglob; for dir in path/to/*/; do files=("$dir"/*{mp3,flac}); [ "${files[0]}" ] && mv "$dir" ~/test; done

或者,对于那些喜欢将命令分布在多行中的人来说:

shopt -s nullglob
for dir in path/to/*/
do
    files=("$dir"/*{mp3,flac})
    [ "${files[0]}" ] && mv "$dir" ~/test
done

当然,在运行之前,path/to/请按照问题所示更改到测试目录。然后,path/to/*/应扩展到所有感兴趣的目录。

怎么运行的

  • shopt -s nullglob

    这会设置 nullglob,以便不返回文件的路径名扩展将返回一个空字符串。

  • for dir in path/to/*/; do

    这将开始对测试目录中的所有目录进行循环。

  • files=("$dir"/*{mp3,flac})

    这将创建一个数组,其元素是任何以或$dir结尾的文件名。mp3flac

  • [ "${files[0]}" ] && mv "$dir" ~/test

    如果数组files不为空(意味着目录中至少有一个 mp3 或 flac 文件),则将目录移动dir~/test

  • done

    这标志着循环的结束。

相关内容