Chinaunix

标题: Linux 批量重命名的问题 [打印本页]

作者: 277702021    时间: 2018-12-27 14:16
标题: Linux 批量重命名的问题
本帖最后由 277702021 于 2018-12-27 14:17 编辑

在一个文件夹里有很多个子文件夹,每个字文件夹里的文件都不一样。


例如
/ok/AAA/9999_13800138000_123_222.mp3
/ok/BBB/88_15800158000_223_112.mp3
/ok/CCC/777_17800178000_823_192.mp3




想做一个批处理,批量重命名OK目录下的所有子目录里面的mp3文件,且只保留其中的电话号码,想变成:


/ok/AAA/13800138000.mp3
/ok/BBB/15800158000.mp3
/ok/CCC/17800178000.mp3

作者: qw7119255    时间: 2018-12-27 16:29
#!/bin/bash
#
files=(`find /ok -name "*.mp3"`)
for i in ${files[@]};do  
  new_name=$(basename $i | cut -d'_' -f 2)
  mv $i `dirname $i`/${new_name}.mp3
done

作者: 277702021    时间: 2018-12-27 17:46
非常感谢 qw7119255  ,你的方法可以,但是还存在一个问题,如果两个文件名一样,会自动删除一个,如果遇到同名,可以保留吗?
例如:

例如
/ok/AAA/9999_13800138000_1673_262.mp3
/ok/BBB/9999_13800138000_123_622.mp3
/ok/CCC/777_17800178000_823_192.mp3
/ok/DDD/777_15800178000_823_192.mp3




其中有两个  13800138000   


是否可以保留呢?比如今天有一个  13800138000 这个号码,明天又有一个 13800138000 号码,可不可以把明天的 13800138000 变成  13800138000A  后台的变成  13800138000C


也就是文件名称如果相同不要覆盖,在后面加一个A,再相同就加一个B。







作者: qw7119255    时间: 2018-12-27 18:39
直接加个时间好了

#!/bin/bash
#
tody=`date +%F`
files=(`find /ok -name "*.mp3"`)
for i in ${files[@]};do  
  new_name=$(basename $i | cut -d'_' -f 2)
  if [ -f `dirname $i`/${new_name}.mp3 ];then
    mv `dirname $i`/${new_name}.mp3 `dirname $i`/${new_name}_${tody}.mp3
    mv $i `dirname $i`/${new_name}.mp3
  else
    mv $i `dirname $i`/${new_name}.mp3
  fi
done
作者: 277702021    时间: 2018-12-27 20:38
谢谢啊,试过了,但是不行。

如果名称相同,只在后面加一个A也可以,不用加B了,我只保留两个文件也行,这样难度是不是降低了一点?
作者: 277702021    时间: 2018-12-29 16:43
本帖最后由 277702021 于 2018-12-29 16:44 编辑

再请问一下:

/13800138000_xxx22_1111.mp3
/13800138000_xd23k_2222.mp3
/13800138000_xd232_3333.mp3
/13912340000_saddd_2222.mp3


这样的状况,我只想保留前面的电话号码,但是有3个号码相同,能否实现如果遇到相同的号码在后面加一个 A?比如13800138000   这个号码已经有了,相同的号码第2个能否变成   13800138000A ,第3个号码13800138000AA,最终得到

13800138000.mp3
13800138000A.mp3
13800138000AA.mp3
13912340000.mp3






欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2