如何将一系列顺序命名的文件从多个文件夹复制到另一个文件夹?

问题描述 投票:1回答:2

我有一个超过一百万个图像的目录,根据捕获图像的位置进行分类。现在这些地方再次按字母顺序排序到文件夹中。例如,

--- 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.
bash
2个回答
0
投票

假设您希望它们都位于同一目的地,并且所有文件都以您表示的方式命名:

               ...
                  |__ 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?


0
投票

你能尝试这样的事吗:

#!/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复制它们

© www.soinside.com 2019 - 2024. All rights reserved.