我有一个目录:
❯ 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.jpg
,2.jpg
,3.jpg
...等等
或
2)使用子目录ID(./images/2060511653921052666.images/thumb-150x150.jpg)作为目标文件名(在此示例中为2060511653921052666.jpg
)?
答案 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
命令以测试您的命令。