递归重命名文件并删除一个字符

时间:2012-04-15 13:39:54

标签: linux bash rename xargs

有些文件名包含'?' 如你所知,windows有这样的字符问题。我想使用xarg递归重命名文件夹中的所有文件。例如

09 - grand hall?_10.mp3

应该是

09 - grand hall_10.mp3

3 个答案:

答案 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)

说明:

  1. find仅搜索名称中包含“?”的文件
  2. \0设置为IFS中的分隔符,find-print0}和read-d '')可以处理包含特殊内容的文件名单引号,双引号,空格等字符
  3. 最外面的括号将整个命令执行在子shell中,因此保持当前shell的IFS不变。
  4. 脚本中的.可以替换为任何其他目录。
  5. 这个脚本有一个很小的问题:如果一个文件的名字和一个父母的名字都包含'?',它可能会破坏。这可以处理,但脚本会变得有点丑陋,不太可读。