某个文件夹中的文件 [*] 太多。我想将其中一些文件移到子文件夹中。我该如何操作:
- 将前 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
命令应该对一些小脚本有帮助。
一些参考资料,
根据这些示例弄清楚如何重新分配文件和目录来编写命令行或短脚本。
答案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 有很多选项可用于详细控制,例如处理符号链接。