这是我最初的情况:
例如,在名为 的文件夹中Father
,按以下方式存储了一些文件:Father
包含 24 个子文件夹(我们称其为Child1
, Child2
, ...),每个子文件夹中有 2 个文件,file1.avi
第一个子文件夹file1.nfo
为 2 个,第一个子文件夹为 2 个。第二个,等等。file2.avi
file2.nfo
我想做的是将所有.avi
文件都放在文件夹中Father
。我不关心其他文件丢失。
到目前为止,我用过的最好的方法是使用 a,cp -R ./*.avi .
但它没有从文件夹中提取文件,而且处理时间也很长。
我该怎么写呢?
答案1
glob*
不仅可以用于匹配普通文件,还可以用于匹配目录,因此您要查找的命令是
mv ./*/*.avi .
答案2
您可以使用该find
命令的-exec
选项:
cd Father
find Child1 Child2 ... -name '*.avi' -exec mv -n {} . +
该命令分解如下:
find Child1 Child2 ...
将查找 Child1、Child2 等下的所有文件和目录。默认操作是打印它们的名称-name '*.avi'
将结果限制为与名称模式“*.avi”匹配的文件(或目录)-exec mv {} . +
表示find
将执行命令而不是打印匹配结果;指示{}
命令中find
应将找到的文件名放入其中的位置,+
指示要执行的命令的结尾,并且还表示它应该尝试放入尽可能多的文件名,而不是每个文件名运行一次命令。例如,它可能会执行mv -n Child1/as.avi Child1/many.avi Child1/matching.avi Child1/filenames.avi Child1/as.avi Child1/possible.avi .
如果你想看看这样的命令是什么可能做,你总是可以写-exec echo mv
而不是-exec mv
注1:使用-name '*.avi'
单引号,以便文本*.avi
逐字传递给find
命令,而不是在到达命令之前由 shell 扩展为文件名find
。
笔记2:如果您有多个文件名,位于不同的目录下,但具有相同的文件名,该mv
命令会将所有这些文件移动到同一目录,并且具有相同名称的文件将相互覆盖。您可以通过使用命令来避免这种情况mv -n
(无破坏模式)