有一些文件名包含'?'如你所知,windows有这类字符的问题。我想用xarg
递归地重命名文件夹中的所有文件。例如递归重命名文件并删除一个字符
09 - grand hall?_10.mp3
应该
09 - grand hall_10.mp3
有一些文件名包含'?'如你所知,windows有这类字符的问题。我想用xarg
递归地重命名文件夹中的所有文件。例如递归重命名文件并删除一个字符
09 - grand hall?_10.mp3
应该
09 - grand hall_10.mp3
for file in $(find folder -name '*.mp3'); do
mv -v "$file" $(echo "$file" | tr ? _);
done
上面有空白的问题;这是更好的:
find folder -name '*.mp3' -exec echo "'{}'" \; |
while read file; do
echo -n "mv -v $file " && echo $file | tr ? _;
done | sh
的想法是找到的所有文件,然后在报价呼应他们。将输出传送到一个while
循环中,该循环为每个文件构造一个mv
命令,然后将即转换为新的shell。
丑,但如果你不喜欢答案,你不应该问这个问题。 :-)
这是非常丑陋的,但我还是把它作为一个个人的挑战找到一个班轮,将工作。 :-)
find folder -name '*.mp3' -exec \
sh -c "echo -n 'mv \"{}\" ' && echo \'{}\' | tr ? _" \; | sh
的策略是找到文件,使用echo
构建mv
命令在报价时,其名称中的每个文件,然后通过管道输出到一个壳。
找到:缺少参数到'-exec' – mahmood 2012-04-15 13:52:54
@mahmood:固定。谢谢你的收获! – 2012-04-15 15:05:05
这是这个问题最优雅的答案。谢谢! – 2012-06-29 16:48:31
这一个班轮应该工作,即使文件名包含单/双引号和空格:
(IFS=\0;find . -name \*\\?\* -type f -print0| while read -d '' f;do mv -v $f $(echo $f|tr -d \?);done)
说明: '?'
find
只搜索文件名称中包含\0
作为分隔符在IFS
,find
(由-print0
)和read
(由-d ''
)可以处理包含特殊字符,如单引号,双引号,空格等的文件名IFS
完好无损。.
可以被任何其他目录替换。
当你在它的时候,你想删除空格吗? – Shep 2012-04-15 14:29:28
这并不坏。那么该怎么办? – mahmood 2012-04-15 14:30:40
并解决_have to_ use'xarg'? – Shep 2012-04-15 14:31:03