【问题标题】:SSH find and replace string in a list of filenamesSSH 在文件名列表中查找和替换字符串
【发布时间】:2013-08-31 19:21:22
【问题描述】:

我们有大约 3000 个 MP3 文件的存储库。其中许多文件的名称中都有我们的旧域名。 例如:somesong_oldDomainName.mp3

我需要通过 SSH 连接到站点,找到这些文件的所有实例并用新域名重命名它们。 示例:somesong_NEWDomainName.mp3

我知道基本的 SSH 命令,但不知道这样的高级命令。

很确定它会是多个命令的组合。

【问题讨论】:

  • ssh 只是与远程站点建立通信的方式,如果它是基于 linux 的,你可能有某种 shell,例如bash,所以看看这个:stackoverflow.com/questions/11053558/…
  • 您能否验证文件驻留在哪个系统上?基于Linux?我的意思是在您的问题中添加标签“bash、shell、远程访问”,但审阅者认为“多个命令的组合”可能证明 shell 问题是合理的。那么,当您通过 SSH 连接到您的 mp3 机器时,您是否获得了一个交互式 shell(如果是,是哪一个)?
  • 所以我在使用 Bash 的 Linux 服务器上......

标签: linux bash shell ssh remote-access


【解决方案1】:

假设您在 ssh 进入您的 linux 服务器时获得了一个交互式 shell,这可能是一种可能的方式:

ssh user@machine-name-or-ip

然后你会得到一些类似的终端

user@machine-name:~$

您输入要在该远程计算机上执行的命令的位置。

正如 cmets 中提到的,这里的答案可能非常合适:

Bash: Rename small part of multiple files in middle of name

user@machine-name:~$ for i in *.mp3; do mv "$i" "$(echo "$i" | sed 's/_oldDomainName/_NEWDomainName/g')"; done

这假设,您的当前目录是其中包含所有 MP3 文件的目录。

如果您不想对文件进行交互式操作,例如因为它们经常更改,并且您需要脚本来执行此操作,所以 SSH 也可以远程执行命令和/或 shell 脚本。

使用 SSH 调用直接传递命令: SSH error when executing a remote command: "stdin: is not a tty"

将本地 shell 脚本通过管道传输到 SSH 连接:How to use SSH to run a shell script on a remote machine?

通过 SSH 运行远程 shell 脚本:how to run a script file remotely using ssh

编辑: 假设您通过 SSH 连接到您的远程计算机并且有一些类似的 bash 和 sed 版本,它应该像这样工作:

$ ls
bar_chosefil.mp3 boo_chosefil.mp3 foo_chosefil.mp3
$ for i in *.mp3; do mv $i $(echo $i | sed 's/chosefil/tamasha/g'); done
$ ls
bar_tamasha.mp3 boo_tamasha.mp3 foo_tamasha.mp3

涉及的版本:

  • bash:4.2.25
  • sed:4.2.1
  • MV:8.13

编辑 2: 更新了使用文件名中的空格的命令

$ ls
asd chosefil.mp3 bar_chosefil.mp3 boo_chosefil.mp3 foo_chosefil.mp3
$ for i in *.mp3; do mv "$i" "$(echo "$i" | sed 's/chosefil/tamasha/g')"; done
$ ls
asd tamasha.mp3 bar_tamasha.mp3 boo_tamasha.mp3 foo_tamasha.mp3

【讨论】:

  • 这个建议似乎只适用于只有一个文件的目录!不确定这是否有意义,但我在仅包含 1 个文件的目录中尝试了它,它正确地重命名了一个文件。但是当我在一个包含多个文件的目录中运行它时,我得到错误提示:“文件名”不是目录!我用这个:for i in *.mp3;做 mv $i $(echo $i | sed 's/chosefil/tamasha/g');完成
  • 我假设您的文件名包含空格?我也更新了答案以与他们一起工作
  • 最好使用shell自带的替换机制,比如mv "$i" "${i/_oldDomainName/_newDomainName}"
猜你喜欢
  • 2011-05-25
  • 2013-02-19
  • 2020-08-12
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
相关资源
最近更新 更多