sh/bash/dash/ksh/zsh等Shell脚本
-
Tenyears
- 帖子: 2245
- 注册时间: 2005-06-30 15:46
- 来自: 成都
#1
帖子
由 Tenyears »
我想用一行find命令来处理一批文件,比如这样将所有文件名前面加一个字符
find . -iname "*mp3" -execdir mv {} A{} \;
但我发现find中“{}”的表示的是“./xx.mp3”而不是我想要的“xx.mp3”,所以命令出错了。怎么得到我想要的东西?
ps.我知道改名字有其他方法,我想问问find的用法,谢谢。
Humanity to others // 己所不欲,勿施与人
Laptop: ThinkPad X220 --- Win7 Home / Ubuntu 12.04
Desktop: Win7/Ubuntu 12.04
Server: Ubuntu12.04
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#2
帖子
由 eexpress »
自己basename就是。|while read i; do echo `basename $i`; done
execdir?
● 鸣学
-
Tenyears
- 帖子: 2245
- 注册时间: 2005-06-30 15:46
- 来自: 成都
#3
帖子
由 Tenyears »
ee总是简洁明了,有的时候不足以解决问题阿。用你的法子,我写成了这样
find . -iname "*.mp3" |while read i; do mv $i ./A`basename $i`; done
但是,只能处理当前路径,不能处理子路径,而-execdir就是起到这个作用,如何改进?
xiechy,你的法子也不行,-printf '%f'只能在前面输出一个XX.mp3,后面的{}还是指示./XX.mp3
Humanity to others // 己所不欲,勿施与人
Laptop: ThinkPad X220 --- Win7 Home / Ubuntu 12.04
Desktop: Win7/Ubuntu 12.04
Server: Ubuntu12.04
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#4
帖子
由 eexpress »
我的意思,只是说。管道以后,就是shell。随便怎么搞都行啊。呵呵。
处理路径,自己用dirname处理,进入目录就是。
因为我只会shell,也因为我不会execdir。

● 鸣学
-
aBiNg
- 帖子: 1331
- 注册时间: 2006-07-09 12:22
- 来自: 南京
#5
帖子
由 aBiNg »
代码: 全选
aBiNg:~/incoming ¶ find . -iname "*.mp3"
./test/b.mp3
./a.mp3
aBiNg:~/incoming ¶ find . -iname "*.mp3" | while read i; do mv $i `echo $i | sed 's:\(.*\)/\(.*\)\.mp3:\1/A\2\.mp3:'`; done
aBiNg:~/incoming ¶ find . -iname "*.mp3"
./test/Ab.mp3
./Aa.mp3
冗长。
rename对regexp的支持有限?find的{ }是搜索结果,而非-exec后命令执行结果。
-
Tenyears
- 帖子: 2245
- 注册时间: 2005-06-30 15:46
- 来自: 成都
#6
帖子
由 Tenyears »
确实。这个方法虽然有效,但不漂亮
Humanity to others // 己所不欲,勿施与人
Laptop: ThinkPad X220 --- Win7 Home / Ubuntu 12.04
Desktop: Win7/Ubuntu 12.04
Server: Ubuntu12.04
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#7
帖子
由 eexpress »
还在折腾啊。你这样的需要,没通用性啊。脚本丑陋点,没关系。实现了就可以了。
find不是万能的。
● 鸣学