【问题标题】:How can I replace a string in all filenames in a directory? (specifically I need to remove "\#015" from all file names in a directory如何替换目录中所有文件名中的字符串? (特别是我需要从目录中的所有文件名中删除“\#015”
【发布时间】:2012-11-05 09:52:37
【问题描述】:

目录 (/root/path/) 中的许多文件都附加了一个奇怪的字符串 (\#015)。帮我用没有奇怪字符串的常规名称替换它们。

我需要:

/root/path/img1.png\#015
/root/path/img2.jpg
/root/path/img3.png\#015

成为:

/root/path/img1.png
/root/path/img2.jpg
/root/path/img3.png

你能帮忙吗?

【问题讨论】:

  • 我的问题已通过在失败的rsync bash 脚本中将行尾 (EOL) 从 Windows 转换为 Unix 得到解决 - 评论是因为此答案是搜索中出现的第一件事。跨度>

标签: linux unix replace sed awk


【解决方案1】:
for file in *\#015
do
   mv -- "$file" "${file%\#015}"
done

您可能需要转义“\”。先在 tmp 目录下试一下。

【讨论】:

    【解决方案2】:

    如果您安装了rename,这将成为一项相当简单的任务:

    rename 's/\\#015$//' /root/path/*\\#015
    

    如有必要,您可以添加-f 标志以强制覆盖现有文件。

    【讨论】:

      【解决方案3】:

      这就是我过去用一个小外壳解决类似问题的方法。

      cd /root/path/
      ls | grep '\#015' | sed 's/\(.*\)\\#015/mv & \1/' | sh
      

      【讨论】:

      • 当然,Ryan,你会去掉尾随的| sh,这样你就可以查看“将要执行”的命令,直到你确定这些命令不会产生意想不到的后果, 正确的? ;-) 祝大家好运。
      • 而不是ls | grep '\#015',使用ls *\#015 会更自然。无论如何我都不会使用这种方法,因为你只需要一个简单的 shell 循环。
      【解决方案4】:

      您可以使用find 和参数替换来做到这一点,如下所示:

      #!/bin/bash
      
      find -name '*\\#015' | while IFS= read -r f
      do
          mv -- "${f}" "${f%?????}"
      done
      
      • 将上面的代码放在你的/root/path/中一个名为my_script.sh的脚本中,并由chmod +x my_script.sh && ./my_script.sh运行
      • 请注意,这会将更改递归地应用到/root/path/ 下的所有子文件夹。

      说明:

      • find -name '*\\#015':查找所有以\#015结尾的文件
      • 然后对于找到的每个此类文件:mv "${f}" "${f%?????}" 将其从旧名称重命名为新名称,并删除文件名中的最后 5 个字符。

      【讨论】:

      • 请记住引用您的变量,除非您有非常具体的理由不这样做。如果您的文件名包含空格或任何通配符或以 - 符号开头,则上述操作将失败。
      • @EdMorton 好电话。现在编辑。
      • mv 之后添加--。更重要的是,您的循环不会像所写的那样工作。你需要写成find -name '*\\#015' | while IFS= read -r file
      • 澄清一下,你不能做for f in $files,否则对于包含空格和做通配符的文件名会失败,但你也不能做for f in "$files",否则所有文件名将被连接成一个细绳。因此需要将 find 输出通过管道传输到 while read 循环。对于包含换行符的文件名,它仍然会失败,您需要使用 xargs 或 find -exec 来解决这个问题,但这一切都可能变得不必要地复杂。 for file in * 是最好的选择,因为它清晰、简单且万无一失。
      • @EdMorton 感谢您指出这一点。你能详细说明一下while IFS= read -r file吗?我假设将内部字段分隔符设置为“”? (但默认情况下不是 IFS 空间吗?)另外,您可以指出我阅读read 的资源吗?我试着看,但结果却被系统调用饱和了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2015-04-11
      • 1970-01-01
      • 2012-01-21
      相关资源
      最近更新 更多