我应该使用什么命令来移动这些特定元素?

我应该使用什么命令来移动这些特定元素?

这是我最初的情况:

例如,在名为 的文件夹中Father,按以下方式存储了一些文件:Father包含 24 个子文件夹(我们称其为Child1, Child2, ...),每个子文件夹中有 2 个文件,file1.avi第一个子文件夹file1.nfo为 2 个,第一个子文件夹为 2 个。第二个,等等。file2.avifile2.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(无破坏模式)

相关内容