我有一个超过一百万个图像的目录,根据捕获图像的位置进行分类。现在这些地方再次按字母顺序排序到文件夹中。例如,
--- Images
|____ a
| |___ airfield
| |___ alley
|
|____ b
|___ bank
|__ bank-00001.jpg
|__ bank-00002.jpg
.
.
.
如何将每个位置子目录(如机场,小巷,银行等)中的前100个文件复制到其他文件夹?
我试过了:
find /Source/Directory/path -type f -print | tail -100 | xargs -J % cp % /Destination/Diretory/path
但我猜它覆盖了图像,因为只复制了最后一个子文件夹的最后100个图像。
我的bash版本
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
Copyright (C) 2007 Free Software Foundation, Inc.
假设您希望它们都位于同一目的地,并且所有文件都以您表示的方式命名:
...
|__ bank-00001.jpg
|__ bank-00002.jpg
您可以通过执行以下操作简化问题:
对于等于或高于4.0的bash版本:
for i in {00000001...00000100}; do
find /path/to/Images -maxdepth 3 -mindepth 1 -type f -name "*_$i.jpg" -exec cp {} /destination/path \;
done
这样,您可以根据每个子文件夹的名称复制每个子子文件夹中的所有前100个图像。
对于4.0之前的bash版本:
for i in $(seq -f '%08g' 1 100)
do
find /path/to/Images -maxdepth 3 -mindepth 1 -type f -name "*_$i.jpg" -exec cp {} /destination/path \;
done
How to zero pad a sequence of integers in bash so that all have the same width?
你能尝试这样的事吗:
#!/bin/bash
for files in $(find . -type f | sed -r 's/(.*\/).*$/\1/g' | uniq);
do
find ${files} -type f | head -n100 | tr '\n' '\0' | xargs -0 cp /path/where/to/copy;
done
我不确定它是否正确,没有linux-terminal附近。逻辑是:1)查找uniq文件的完整路径。 2)运行循环,搜索每个目录中的文件,使用head -n100
获取前100个文件,使用xargs复制它们