如何移动前x个文件


21

我有一个包含数千个无序文件的巨大文件夹。通过mv命令将前5000个移动到子文件夹是否可行?现在我用

 mv *some_pattern* ./subfolder1/

到目前为止,我非常随机地移动图像,如果每个子文件夹中没有完全5000个文件,这并不重要。有更好的方法吗?


Answers:


23
mv `ls | head -500` ./subfolder1/

12
(假设文件名都不包含空格,制表符,换行符,星号,方括号,问号字符或以-或开头,.并假设subfolder1其自身未出现在该列表中。)
StéphaneChazelas 2013年

如果文件包含@StéphaneChazelas,我们如何修改命令?
Peiti Li

$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
Brian Thomas

15

zsh

mv -- *(D.oN[1,5000]) ./subfolder1

要按照目录中的顺序移动多达5000个常规文件。

对于按字典顺序排序的列表中的前5000个:

mv -- *(D.[1,5000]) ./subfolder1

如果您收到有关arg list的错误,则时间过长。您可以通过发出以下命令来使用zsh的buitin mv命令:

zmodload zsh/files

第一。

POSIXly:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/

2
POSIX代码段是一颗瑰宝
iruvar

如果我使用bash出现错误怎么办?
Brian Thomas

8

一个简单的版本,支持特殊的字符,空格等。

ls -Q dir1 | head -1000 | xargs -i mv dir1/{} dir2/

对于这个工作的,是dir2必须存在,你必须从父目录执行它dir1dir2

这会将1000个文件从dir1移到dir2。


好一个!ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ 用于在dir1中移动1000个最大文件(-S按大小列出文件)
oneklc'5

1
请注意,ls -Q不会产生与xargs预期输入格式兼容的输出。它有助于包含空格字符的文件名,但对于双引号或反斜杠不起作用,对于包含控制字符(包括TAB)的文件名有害。
斯特凡Chazelas

3

您可能需要执行以下操作:

x=1
for file in *
do
    if [ "X$x" = "X#####" ]; then
        break
    fi
    mv $file <destination>
    x=`expr $x + 1`
done

该脚本可用于bash,ksh,sh和多个UNIX变体。


1
(只要文件名中不包含空格,制表符,换行符,星号,方括号,问号字符或以-或。开头,destination并且文件名不显示在该列表中。)
StéphaneChazelas 2013年

@StephaneChazelas正确。这不是一个完整的解决方案,而只是解决问题的一种方法。
Karlson 2013年

3
  1. 转到要从中移动文件的目录
  2. 在命令下运行

    find . -name 'Hello*.gz' | head -n 5000 | xargs -I {} mv {} /data01/path/ 

find命令中,.(点)表示当前目录

查找以Hello开头并以gz结尾的文件,前5000个文件将被移动到路径 /data01/path/


1

我成功完成了50,000的移动,而没有这样的mv bash错误

 ls | head -50000 | xargs -I{} sudo mv {} 01/

有趣的是,这是在samba共享上,因此50k的限制是因为Windows资源管理器GUI通常不喜欢目录中的超过60k文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.