获取find命令的扩展参数的第一个字符


1

我有大量的图像,我想将它们放在与前3个字符+ .jpg扩展名相匹配的文件夹中。

所以我想抓取4_1_0002.png文件(所有以4_1开头的文件)并将其放入4_1_.jpg文件夹中。同样我想抓取4_2_0002.png文件(所有以4_2开头的文件)并将其放在4_2_.jpg文件夹中。

我想要排序的所有文件现在都在一个巨大的文件夹中。我希望使用find命令,但我不知道如何从{}扩展参数中提取前三个字符。

find . -type f -ok echo mv {} "path/first3char.jpg" \;

在此输入图像描述

在此输入图像描述


只是好奇,你为什么要把.png文件放在一个.jpg扩展名的文件夹中,为什么不扩展名为.png的文件夹呢?
3439894年

起初我和jpg一起工作,但是转到了pngs。没有打扰改名
sanjihan

Answers:


3

假设你的所有文件都在同一个目录中,文件名是合理的,比如说

 find . -maxdepth 1 -type f -name '*png' |
     while read line; do
         echo mv "$line" "path/${line:2:3}.jpg/"
     done

首先按编写(包括echo)运行命令,检查结果是否有意义。然后删除echo并重新运行。


虽然我对答案进行了投票,但是我会以测试目录的形式添加条件,例如[[ -d path/${line:2:3}.jpg ]],并使用它,例如,find . -maxdepth 1 -type f -name '*png' | while read line; do [[ -d path/${line:2:3}.jpg ]] && echo mv "$line" "path/${line:2:3}.jpg/"; done。也就是说,显然如果目录不存在,它将不会移动文件。建议的原因是任何时候我使用通配符,例如,'*png'find命令中,我喜欢制作后续代码,它将根据通配符find条件的结果进行操作。
3439894 2017年

我提到这一点是因为作为一个例子,如果一个意外(或内容)将尾随斜杠留下“ "path/${line:2:3}.jpg/""path/${line:2:3}.jpg”,它会通过将文件移动到${line:2:3}.jpg文件而不是目录来重命名文件,因为该目录不存在。
user3439894
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.