使用示例(虚构):将.mp3文件重命名为.txt文件。
我希望能够像这样做一些事情
find -name '*.mp3' -print0 | xargs -0 -I'file' mv file ${file%.mp3}.txt
这种方法不起作用,所以我用管道将find
的输出通过sed -e 's/.mp3//g'
进行处理,这样就可以解决问题。
但这似乎有点hackish(笨拙的);是否有一种使用通常的bash ${x%y}
语法的方法?
xargs -0 -I'file' mv file ${file%.mp3}.txt
不会生效,因为 file
变量将被 xargs 程序扩展而不是 shell。实际上,将其称为变量并不完全正确,在 xargs 的手册中称之为“replace-str”。find -name '*.mp3' -print0 | xargs -0 bash -c \
'while [ -n "$1" ]; do mv "$1" "${1%.mp3}.txt" ; shift; done;' "bash"
只是想再提供一个建议,即使它不使用 shell 的替换机制,而是使用 sed。
find -name '*.mp3' -print |
sed -e 's/\.mp3$//' -e "s/.*/mv '&\.mp3' '&\.txt'/" |
sh
mv
命令行,并将结果传递给sh
。/usr/ucb/blah/barf/vomit/xpg4/bin/sed
的XPG兼容sed)。sh
和其他类似受限shell中运行。 - tripleeefind -name '*.mp3' -print0 | parallel -0 mv {} {.}.txt
find -name '*.mp3' | parallel mv {} {.}.txt
find . -type f -name '*.mp3' | while read -r F
do
mv "$F" "${F%.mp3}.txt"
done
Bash 4+
shopt -s globstar
shopt -s nullglob
for file in **/*.mp3
do
mv "$file" "${file%.mp3}.txt"
done
perl rename.pl 's/\.mp3$/.txt/' *.mp3
# Or **/*.mp3 for zsh and bash with specific settings set, for a recursive
# rename.
http://people.sc.fsu.edu/~jburkardt/pl_src/rename/rename.html
xargs
中“纯粹地”完成这件事吗?不行! - J. M. Becker