linux - 遍历目录中的文件;拉出文件名以替换现有文件中的字符串

标签 linux bash macos scripting

我有一个标记文件目录,我正试图用它来完成以下任务:
获取标记文件的文件名并将其存储在变量中
获取该变量并用存储的文件名变量替换文件中的一系列字符串
循环浏览目录中的所有文件并执行相同的操作
我很接近了,但是下面的代码将只提取第一个标记文件的文件名,并将变量应用于文件中的所有字符串。这是我目前的工作准则:

#!/bin/bash

for file in /home/user/dir/*; do

  str="somestring"
  filename=$(basename $file)
  fn="$(echo "${filename%.*}")"

  find ./ -type f -exec sed -i '' -e "s/${str}/${fn}/g" {} \;

done

假设标记文件如下所示:
123456789.md和其他几个带有随机数字名称的.md文件。
.md文件的结构类似于:
---
layout: default
date: 2010-03-28
original: /orig/somestring.jpg
thumbnail: /thumb/somestring_thumb.jpg
permalink: /images/somestring/
---

我的目标是让脚本根据.md文件本身的文件名使每个文件看起来像这样:
---
layout: default
date: 2010-03-28
original: /orig/123456789.jpg
thumbnail: /thumb/123456789_thumb.jpg
permalink: /images/123456789/
---

对编辑sed调用的最佳方法,或编写此调用的其他方法有何想法?在我的测试中,sed偶尔会返回/home/user/dir/123456789.md,但无论如何都要对字符串进行重命名,即使它是错误的字符串。

最佳答案

如果我理解正确,下面的方法就行了:

#!/bin/bash

for file in /home/user/dir/*; do

    str="somestring"
    filename=$(basename "$file")
    fn=${filename%.*}

    LANG=C sed -i '' -e "s/${str}/${fn}/g" "$file"

done

问题是您正在执行find & sed循环中的for,这将覆盖不相关文件中的字符串。
LANG=Csed之前将是sed: RE error: illegal byte sequence问题的常见解决方法。

关于linux - 遍历目录中的文件;拉出文件名以替换现有文件中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55410387/

相关文章:

linux - [ : too many arguments when taking * as an input

c++ - 在 Linux 上的 Qt 中获取应用程序图标 URL

linux - 如何删除图案线之间的所有线

php - LAMP:如何为用户动态创建 .Zip 大文件,而不会出现磁盘/CPU 抖动

mysql - bash 中 mysql 查询之外的变量未由 echo 上的本地 bash 变量填充

mysql - MySQL安装时绑定(bind)IP

linux - 递归查找具有特定扩展名的文件

objective-c - iMac - 缺少 x86 版本的 GameKit

C++/QT - QFileDialog::getOpenFileName 过滤器 *.xml 禁用名称中包含日文字符的文件

xcode - dyld:库未加载:/usr/local/lib/libmpfr.4.dylib