2012-04-15 39 views
2

有一些文件名包含'?'如你所知,windows有这类字符的问题。我想用xarg递归地重命名文件夹中的所有文件。例如递归重命名文件并删除一个字符

09 - grand hall?_10.mp3 

应该

09 - grand hall_10.mp3 
+0

当你在它的时候,你想删除空格吗? – Shep 2012-04-15 14:29:28

+0

这并不坏。那么该怎么办? – mahmood 2012-04-15 14:30:40

+0

并解决_have to_ use'xarg'? – Shep 2012-04-15 14:31:03

回答

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。

丑,但如果你不喜欢答案,你不应该问这个问题。 :-)

+0

空间造成噪音。如何去除它们? – mahmood 2012-04-15 14:32:12

+0

@AdamLiss我已经在'$ file'中解决了一些小问题,但它仍然使用'for $(find _folder_-name'* .mp3')中的'for file'重新标记问题''。你可能想尝试一些基于'find -print0'的管道,并通过管道传输到'read -d'' – je4d 2012-04-15 14:49:29

+0

@ je4d。Tokenizing是固定的,格式是正确的。谢谢您的帮助! – 2012-04-15 15:04:17

1

这是非常丑陋的,但我还是把它作为一个个人的挑战找到一个班轮,将工作。 :-)

find folder -name '*.mp3' -exec \
  sh -c "echo -n 'mv \"{}\" ' && echo \'{}\' | tr ? _" \; | sh

的策略是找到文件,使用echo构建mv命令在报价时,其名称中的每个文件,然后通过管道输出到一个壳。

+1

找到:缺少参数到'-exec' – mahmood 2012-04-15 13:52:54

+0

@mahmood:固定。谢谢你的收获! – 2012-04-15 15:05:05

+0

这是这个问题最优雅的答案。谢谢! – 2012-06-29 16:48:31

0

这一个班轮应该工作,即使文件名包含单/双引号和空格:

(IFS=\0;find . -name \*\\?\* -type f -print0| while read -d '' f;do mv -v $f $(echo $f|tr -d \?);done) 

说明: '?'

  1. find只搜索文件名称中包含
  2. 设置\0作为分隔符在IFSfind(由-print0)和read(由-d '')可以处理包含特殊字符,如单引号,双引号,空格等的文件名
  3. 最外parenthese把整个命令执行在subshel​​l,因此保持当前shell的IFS完好无损。
  4. 脚本中的.可以被任何其他目录替换。
  5. 但是,这个脚本有一个很小的问题:如果一个文件的名字和其父母的名字之一包含'?',它可能会中断。这可以被处理,但脚本会变得有点丑陋,而且不太可读。