有些文件名包含'?'
如你所知,windows有这样的字符问题。我想使用xarg
递归重命名文件夹中的所有文件。例如
09 - grand hall?_10.mp3
应该是
09 - grand hall_10.mp3
答案 0 :(得分:1)
这非常难看,但我把它作为个人挑战,找到一个可行的单线程。 : - )
find folder -name '*.mp3' -exec \
sh -c "echo -n 'mv \"{}\" ' && echo \'{}\' | tr ? _" \; | sh
策略是找到文件,使用echo
为每个文件构造一个mv
命令,其名称用引号括起来,然后将输出传递给shell。
答案 1 :(得分:1)
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中。
丑陋,但如果你不喜欢这个答案,你就不应该问这个问题。 : - )
答案 2 :(得分:0)
即使文件名包含单/双引号和空格,此单行也应该有效:
(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
不变。.
可以替换为任何其他目录。