【问题标题】:Problems with Bash rename scriptBash 重命名脚本的问题
【发布时间】:2017-10-26 16:34:32
【问题描述】:

我有一个在 OSX 终端中运行的非常简单的 bash 脚本。它旨在使用特定文件路径重命名文件。几个月前它可以正常工作,但最近发生了各种疯狂的事情,我不知道为什么。

代码如下:

mv() { command mv "$@"; sleep 1; }
mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate1.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate1A.tif
mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate2.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate2A.tif
mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate3.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate3A.tif
mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate4.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate4A.tif
mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_lifestyle.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_lifestyleA.tif
mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_standard.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_standardA.tif

我已经在有和没有第一行的情况下运行它。我添加了睡眠延迟,因为我怀疑导致问题的原因是过于激进的 IT 部门破坏了终端,情况仍然可能如此,但无论哪种方式脚本都不起作用。

这是终端在我运行时返回的内容:

mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate1.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate1A.tif
mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate2.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate2A.tif
mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate3.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Remv -nvest/1140122_alternate3A.tif
mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_alternate4.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Remv -nTest/1140122_alternate4A.tif
mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_lifestyle.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Renmv -nv /Volume22_lifestyleA.tif
mv -nv /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_standard.tif /Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122_standardA.tifç^C^C^C^C^C

如您所见,它使文件重命名以及文件路径变得一团糟,甚至没有改变。我实际上只是在文件名末尾和文件扩展名之间添加字母 A。

有没有人在这里看到任何可能导致这种情况发生的事情?我们的 IT 部门最近开始使用名为 WebSense 的内容网关来监控公司活动,是否有可能是它导致了问题?

【问题讨论】:

  • 您的脚本是否存在任何危险,即您的脚本已靠近 Windows 机器,或者被回车 (^M) 字符污染?我不确定这会解释你很容易看到的东西,但只是想知道。你如何运行它? sh script.sh?你试过bash -x script.sh(或sh -x script.sh)吗?
  • 是的,它肯定在 Windows 机器附近。必须在 Windows 中搜索文件路径,因为我们尚未设置 Windows 服务器和 Mac 之间的正确通信。这些文件路径被放入一个 Excel 文档中,然后我在 TextWrangler 中对其进行格式化以在代码中使用。但是,它很有可能把事情弄得一团糟。我也应该尝试在 shell 中而不是直接在终端中运行它。

标签: bash macos terminal rename


【解决方案1】:

你还没有告诉我们(还)你是如何调用你的脚本的。

如果您的脚本仍被识别为可执行文件,则它不会产生您声明的输出 - 它不会只是回显您的脚本,尽管有额外的尾随字符。

  • 如果您直接调用脚本

    • 您的脚本是否有shebang line,如下面的脚本?
    • 它是否被标记为可执行chmod +x <file>
  • 否则:您将其传递给什么可执行文件?

  • 1234563 @建议?
  • 正如 Jonathan 进一步建议的那样:您是否可能使用 sh -nv <file>bash -nv <file> 调用您的脚本作为一个整体,这至少可以解释为什么源代码 em> 被打印 (-v) 没有执行脚本 (-n),尽管它本身并不能解释意外的尾随字符。

与此同时,本着DRY 的精神重新编写脚本:

#!/bin/bash

pathPrefix='/Volumes/COMMON-LIC-PHOTO/DATA/James/Rename_Test/1140122'

files=(
  "${pathPrefix}_alternate1.tif"
  "${pathPrefix}_alternate2.tif"
  "${pathPrefix}_alternate3.tif"
  "${pathPrefix}_alternate4.tif"
  "${pathPrefix}_lifestyle.tif"
  "${pathPrefix}_standard.tif"
)

for file in "${files[@]}"; do
  mv -nv "$file" "${file%.tif}a.tif" 
done

【讨论】:

  • 请注意,在 macOS 上,mv 命令具有 -v 选项,描述为: -v 导致 mv 冗长,在移动文件后显示文件。
  • @JonathanLeffler:是的,但这会导致以下类型的输出,与源代码截然不同:foo -> bar
  • @JonathanLeffler:这听起来很合理(除了时髦的尾随字符)-我已将您的猜测添加到答案中-让我们看看 OP 会返回什么。
  • 是的,这实际上是一个比我意识到的更复杂的用法。所以首先,我将代码直接粘贴到终端的命令行中。我不是通过外壳执行它。其次,文件路径是在 Windows 中生成的 Excel 工作表中提供给我的。我将路径复制/粘贴到 TextWrangler 并在那里格式化。我替换了所有的空格和类似的东西,但也许这是导致问题的原因?某处有隐藏的回车等?
  • @JamesTrory:令人难以置信的是,在这个时代,macOS 上的 Excel 似乎仍然使用 Mac OS Classic CR-only 换行符(\r,以插入符号表示为 ^M)。但是,当您粘贴到 Terminal.app 中时,这些通常会转换为 Unix 风格的 LF-only 换行符。粘贴到 Terminal.app 通过一个 shell(bash,默认情况下)执行,只是一个 交互式。要检查您粘贴的内容,请将 TextWrangler 缓冲区保存到文件并运行 LC_ALL=C cat -et <file>。我仍然无法解释您的整体症状。
猜你喜欢
  • 2013-06-10
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2016-04-30
  • 2014-07-17
  • 2019-12-25
  • 2011-03-18
相关资源
最近更新 更多