将特定文件从子目录复制到一个目录

时间:2019-07-31 10:47:52

标签: bash file copy zsh file-copying

我有一个目录:

❯ find ./images -name *150x150.jpg
./images/2060511653921052666.images/thumb-150x150.jpg
./images/1777759401031970571.images/thumb-150x150.jpg
./images/1901716489977597520.images/thumb-150x150.jpg
./images/2008758225324557620.images/thumb-150x150.jpg
./images/1988762968386208381.images/thumb-150x150.jpg
./images/1802341648716075239.images/thumb-150x150.jpg
./images/2051017760380879322.images/thumb-150x150.jpg
./images/1974813836146304123.images/thumb-150x150.jpg
./images/2003120002653201215.images/thumb-150x150.jpg
./images/1911925394312129508.images/thumb-150x150.jpg
(...)

我想将所有这些文件(thumb-150x150.jpg)复制到一个目录中。

❯ find ./images -name *150x150.jpg -exec cp {} ./another-directory \;

但是,当然每个文件都会被下一个文件覆盖。

那么我该如何将它们复制到其中一个?

1)1.jpg2.jpg3.jpg ...等等

2)使用子目录ID(./images/2060511653921052666.images/thumb-150x150.jpg)作为目标文件名(在此示例中为2060511653921052666.jpg)?

3 个答案:

答案 0 :(得分:1)

一个简单的bash脚本,使用$RANDOM为复制的每个图像生成一个随机数。每个文件的新名称中都会嵌入一个随机数。

请注意,$RANDOM会生成1到32767之间的随机数。因此,同一随机数可能会产生多次。仅当您要复制数万张图像时,这种情况才可能发生。

提高每个生成的数字的随机性是很容易的。

# !/bin/bash
cd images
for d in *
do
    [ -d $d ] && cd $d
    for image in *150x150.jpg
    do
        cp -pv $image /another-dir/thumb${RANDOM}.jpg
    done
    [ -d $d ] && cd ..
done

答案 1 :(得分:1)

您可以使用循环:

i=1
find ./images -name *150x150.jpg | while read line; do
        cp $line /anotherdir/$i.jpg
        i=$[i+1]
done

答案 2 :(得分:1)

如果您具有GNU并行,则可能:

find ./images -name *150x150.jpg | \
parallel 'mv {} ./another-directory/`stat -c%i {}`_{/}'

stat -c%i {}得到的是每个文件的索引节点

我在系统上测试了以下命令:

find -iname "*.mp3" | parallel 'cp {} ~/tmp/{/.}_`stat -c%i {}`.mp3'

{/} .......... gets just the filename with no full path "basename"
{.} .......... removes extension

在运行实际命令之前,您可以在cp或mv前面放置一个echo命令以测试您的命令。

来源:https://stackoverflow.com/a/16074963/2571881