使用UNIX命令时出现以下问题。我希望浏览大量文件并使用转换它们的命令进行转换。我的想法是这样工作:command *.fileending > *.newfileending
问题是我希望保留文件名,只替换文件结尾。因此filename.fileending
应成为filename.newfileending
。 我如何实现这一目标?
答案 0 :(得分:3)
使用for循环:
for file in *.krn; do
hum2mid "$file" -o "${file%.krn}.mid"
done
在一行中:for file in *.krn; do hum2mid "$file" -o "${file%.krn}.mid"; done
要以递归方式将命令应用于文件和子目录,请使用find|xargs
模式:
find -type f -name '*.krn' -print0 \
| xargs -0 -n1 sh -c 'hum2mid "$1" -o "/destination/dir/$(basename ${1%.krn}.mid)"' -
请注意,如果来自其他目录的文件具有相同名称,则会覆盖已转换的文件。
答案 1 :(得分:0)
rename .fileending .newfileending *
答案 2 :(得分:0)
#!/bin/bash
ls -1 *.fileending | while read i; do
command "$i" > "${i/%.fileending/.newfileending}"
done
如果您需要进程'怪异'文件名(例如嵌入式'\ n'),您可以使用以下技巧:
创建文件foo.sh
:
#!/bin/bash
command "$1" > "${1/%.fileending/.newfileending}"
,然后执行chmod +x foo.sh
,最后执行find . -maxdepth 1 -a -type f -a -name '*.fileending' -print0 | xargs -0 -n 1 -J '%' ./foo.sh "%"