如何在 Linux 中将大量文件夹移动到子文件夹中?

如何在 Linux 中将大量文件夹移动到子文件夹中?

某个文件夹中的文件 [*] 太多。我想将其中一些文件移到子文件夹中。我该如何操作:

  • 将前 3000 个文件或文件夹移动到另一个文件夹,或者
  • 将 3 个月以上的文件移动到另一个文件夹?

谢谢

  • http://www.google.com/search?hl=&q=Errno%3A%3AEMLINK)+“Too+many+links&

答案1

目前为止最简单的方法是使用 zsh。要将当前目录中的前 3000 个文件移动到/other/directory

mv *([1,3000]) /other/directory

如果您创建了一些想要从该命令中排除的子目录:

setopt extended_glob
mv *([1,3000])~(exclude-me|exclude-me-too) /other/directory

要移动超过 3 个月的文件(第一个m表示“修改时间”,第二个m表示月份;小数部分被忽略,因此+2表示≥3):

mv *(mm+2) /other/directory

如果你宁愿使用复杂的命令而不是启动不同的 shell,那么使用 GNU find 命令仍然可以得到合理的单行命令:

find -mindepth 1 -maxdepth 1 -print0 | head -n 3000 | xargs -0 -i mv {} /other/directory
find -mindepth 1 -maxdepth 1 -mtime +91 -print0 | xargs -0 -i mv {} /other/directory

答案2

find命令应该对一些小脚本有帮助。

一些参考资料,

  1. Unix/Linux“find”命令教程
  2. Linux find 命令示例
  3. 命令行界面 Ninja 操作指南

根据这些示例弄清楚如何重新分配文件和目录来编写命令行或短脚本。

答案3

类似这样的脚本应该可以将前 NUMBER_OF_FILES 个文件移动到 SUBDIRECTORY:

NUMBER_OF_FILES=3000  
SUBDIRECTORY=target_folder_name  
NUM=0

find . -type f -maxdepth 1 | sort > /tmp/$$  
exec 4</tmp/$$  
while read FILENAME <&4  
do  
NUM=`expr $NUM + 1`  
if [ $NUM -le $NUMBER_OF_FILES ]  
then  
mv $FILENAME $SUBDIRECTORY  
fi  
done  
rm /tmp/$$ 

对于 90 天或更早之前修改的内容,如下所示:

NUMBER_OF_DAYS=90  
SUBDIRECTORY=target_folder_name  

find . -type f -maxdepth 1 -mtime +$NUMBER_OF_DAYS | sort > /tmp/$$  
exec 4</tmp/$$  
while read FILENAME <&4  
do  
mv $FILENAME $SUBDIRECTORY  
done  
rm /tmp/$$

答案4

我将如何修改丹尼斯·威廉森的回答:

find . -maxdepth 1 -type f -mtime +30 | rsync -nav --remove-source-files --files-from=- . archive/.

用于测试,以及

find . -maxdepth 1 -type f -mtime +30 | rsync  -av --remove-source-files --files-from=- . archive/.

寻找真实的东西。

使用 rsync 而不是 mv 只是因为 rsync 支持在标准输入上指定其源文件。但额外的好处是 rsync 有很多选项可用于详细控制,例如处理符号链接。

相关内容