文件夹结构示例:
➜ 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
结尾的文件名。mp3
flac
[ "${files[0]}" ] && mv "$dir" ~/test
如果数组
files
不为空(意味着目录中至少有一个 mp3 或 flac 文件),则将目录移动dir
到~/test
。done
这标志着循环的结束。