将数百万个文件移动到具有特定名称模式的不同目录

将数百万个文件移动到具有特定名称模式的不同目录

我在 Linux 机器上有数百万个具有以下命名法的文件:

1559704165_a1ac6f55fef555ee.jpg

前 10 位数字是时间戳,后面的 10 位数字_是特定的 ID。我想将与特定文件名 id 匹配的所有文件移动到不同的文件夹。

我在包含文件的目录上尝试了这个

find . -maxdepth 1 -type f | ??????????_a1ac*.jpg |xargs mv -t "/home/ubuntu/ntest"

但是我收到一条错误消息:

bash 1559704165_a1ac6f55fef555ee.jpg: command not found

当我尝试时,mv ??????????_a1ac*.jpg 出现参数列表太长错误。我有至少 15 种不同的文件名模式。我该如何移动它们。

答案1

你应该使用:

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' \
-exec mv -t destination "{}" +

因此maxdepth 1意味着您要在当前目录中搜索没有子目录。

type f表示仅查找文件。

name '??????????_a1ac*.jpg'是与您正在搜索的文件匹配的模式。

mv -t destination "{}" +表示将匹配的文件移动到目的地。这里+将新的匹配文件添加到前一个文件中,例如:

mv -t dest a b c d

这里abcd是不同的文件。

答案2

你的命令,

find . -maxdepth 1 -type f | ??????????_a1ac*.jpg |xargs mv -t "/home/ubuntu/ntest"

将所有文件的列表通过管道传输到所有文件!

find . -maxdepth 1 -type f -name `*_a1ac*.jpg` -print0 |\
xargs  -0 -r mv -t "/home/ubuntu/ntest"

会成功的。

答案3

你们非常接近。您应该使用该-name选项find。并记住引用该模式。

所以

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' |xargs mv -t "/home/ubuntu/ntest"

答案4

如果您想在同一主机系统上移动文件(我猜您正在使用 )mvrsync可能是一个更快的选择:

rsync -av --inplace -W /source/??????????_a1ac*.jpg /home/ubuntu/ntest/

--inplace-W准备加快这一进程。

这是否会产生另一个参数列表太长错误然后你可以将列表提供给rsync

例如,使用 find 制作列表

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' > /tmp/my_image_list.txt

并把它给rsync

rsync -av --inplace -W --files-from=/tmp/my_image_list.txt /path/to/files /home/ubuntu/ntest/

这里的来源是/path/to/files,因为rsync会将您提供的列表视为相对于您的来源。


要点是:rsyncmv如果文件不在同一文件系统上,则速度比

相关内容