有人真的知道如何一次将 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
此方法将处理名称中带有空格的文件。