我在 Linux 机器上有数百万个具有以下命名法的文件:
1559704165_a1ac6f55fef555ee.jpg
前 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 种不同的文件名模式。我该如何移动它们。
你应该使用:
所以
maxdepth 1
意味着您要在当前目录中搜索没有子目录。type f
表示仅查找文件。name '??????????_a1ac*.jpg'
是与您正在搜索的文件匹配的模式。mv -t destination "{}" +
表示将匹配的文件移动到目的地。这里+
将新的匹配文件添加到以前的文件中,例如:这里 abcd 是不同的文件。
你的命令,
将所有文件的列表通过管道传输到所有文件!
会成功的。
你很亲密。您应该使用该
-name
选项来find
. 并记住引用模式。所以
不像
find
解决方案那样“好”,但另一个有效的解决方案是使mv
命令更细化。这会进行 4096 次移动,每次
mv
操作移动的文件数量较少。如果你想在同一个主机系统上移动文件,我猜你正在使用你的
mv
,rsync
可能是一个更快的选择:--inplace
并-W
设置为加快这一进程。如果这会产生另一个参数列表太长的错误,那么您可以将列表提供给
rsync
例如,使用 find 制作列表
并将其交给
rsync
这里的来源是
/path/to/files
,因为rsync
会将您提供的列表视为相对于您的来源。关键是:如果文件不在同一个文件系统上,则
rsync
比 快mv
。