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

时间:2017-12-21 14:32:27

标签: bash

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

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

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分: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终端。逻辑是: 1)找到uniq文件的完整路径。 2)在循环中运行,搜索每个目录中的文件,获取head -n100前100个文件,使用xargs复制它们