![将数百万个文件移动到具有特定名称模式的不同目录](https://linux22.com/image/156672/%E5%B0%86%E6%95%B0%E7%99%BE%E4%B8%87%E4%B8%AA%E6%96%87%E4%BB%B6%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E5%90%8D%E7%A7%B0%E6%A8%A1%E5%BC%8F%E7%9A%84%E4%B8%8D%E5%90%8C%E7%9B%AE%E5%BD%95.png)
我在 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
如果您想在同一主机系统上移动文件(我猜您正在使用 )mv
,rsync
可能是一个更快的选择:
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
会将您提供的列表视为相对于您的来源。
要点是:rsync
mv
如果文件不在同一文件系统上,则速度比。