在 Linux Redhat 中将指定数量的文件从一个目录移动到另一个目录

在 Linux Redhat 中将指定数量的文件从一个目录移动到另一个目录

有人真的知道如何一次将 X 个文件从一个目录移动到另一个目录吗?此页面上的每个“示例”都会显示错误并且毫无用处。我一次只能移动五十 (50) 个文件,然后“休眠”一段时间。文件名不同,但扩展名相同。正如我所说,每个“ls”示例都会在 Redhat 中产生错误。

答案1

要一次移动给定数量的文件并在移动之间休眠 5 秒,您可以在源目录中使用类似于以下一行的内容:

 while true; do mv -v $(ls -1 *yyy | head -n 5) otherdir/ ; sleep 5; done

其中yyy等于你常用的文件扩展名,-n 5代表一次移动5个文件,otherdir是你的目标目录。您将需要调整循环以满足您的要求,如此处所列,一旦移动所有源文件,它将引发错误。

答案2

可以调整以接受扩展名和目标目录的小脚本将完成此任务:

#!/bin/bash

files=$(find . -maxdepth 1 -type f -name "*.txt" | head -n50)

while [[ ! -z $files ]]; do
  for f in $files; do
    mv $f ../t2
  done

  files=$(find . -maxdepth 1 -type f -name "*.txt" | head -n50)
done

针对我创建了 1,067 个文件的目录进行了测试,并且他们移动了它们。

我确信还有一种方法可以优化这个脚本。

编辑:

正如评论所指出的,上面的脚本不考虑空格。考虑空格(但也许不是每个特殊字符,尤其是文件名中的回车符)的方法可能如下所示:

#!/bin/bash

function move50() {
  local NUM=0
  find . -name "*.txt" | head -n50 | (while read -r f; do
     echo "   $f"
      mv "$f" ../t2
      (( NUM++ ))
  done
  return $NUM)
}


cntr=1
while [[ $cntr -gt 0 ]]; do
  move50
  cntr=$?
done

此方法将处理名称中带有空格的文件。

相关内容