【问题标题】:recursively rename files and remove a character递归重命名文件并删除一个字符
【发布时间】:2012-04-27 02:22:27
【问题描述】:

有些文件名包含'?' 如您所知,Windows 存在此类字符的问题。我想使用xarg 递归地重命名文件夹中的所有文件。例如

09 - grand hall?_10.mp3

应该是

09 - grand hall_10.mp3

【问题讨论】:

  • 当您使用它时,您要删除空格吗?
  • 还不错。那该怎么办呢?
  • 解决方案是否必须使用xarg
  • 目录中是否包含空格或?
  • 我不知道。我以为我必须使用 xargs

标签: linux bash rename xargs


【解决方案1】:

这非常难看,但我认为找到一个可行的单线是一项个人挑战。 :-)

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

策略是找到文件,使用echo为每个文件构造一个mv命令,并用引号将其名称输出,然后将输出传递到shell。

【讨论】:

  • 发现:`-exec' 缺少参数
  • @mahmood:已修复。谢谢你的收获!
  • 这是迄今为止对这个问题最优雅的答案。谢谢!
  • @Bicou:也许对于“优雅”的一些定义。 :-) 很高兴它对你有用。
【解决方案2】:

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。

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

【讨论】:

  • 空格会产生噪音。如何删除它们?
  • @AdamLiss 我已经修复了$file 中的一些小问题,但for file in $(find _folder_ -name '*.mp3') 仍然存在重新标记问题。您可能想尝试基于 find -print0 管道到 read -d '' 的东西
  • @je4d 标记化是固定的,格式符合预期。感谢您的帮助!
  • @AdamLiss 更接近.. 但是文件名在技术上可以包含换行符,传递列表的唯一防水方法是 null 分隔。您还引入了代码执行问题,因为我可以创建一个像“file$(my code to run)name”这样的文件名,而您到 sh 的管道最终将运行my code to run
  • @AdamLiss 不是一般情况下.. 文件名也可以包含单引号!要修复它,首先避免使用管道连接到sh,这几乎总是一个坏主意。使用find ... -print0 打印以空字节分隔的文件名。然后将其传送到while read -d '' filename; do ...; done 循环。 -d '' 使 read 使用空字节分隔符。
【解决方案3】:

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

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

解释:

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

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 2018-12-31
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2020-11-23
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多