如何从文件名中删除括号中的字符?

时间:2018-12-16 20:55:35

标签: bash shell text

我有以下格式的文件名列表:

import pandas as pd
import requests
import io

stats = ['Tmax', 'Tmin', 'Rainfall']
regions = ['England', 'Wales', 'Scotland']
base_url = r'https://www.metoffice.gov.uk/pub/data/weather/uk/climate/datasets/{}/date/{}.txt'
dframes = []

for r in regions:
    for s in stats:
        url = base_url.format(s,r)
        df = pd.read_table(io.BytesIO(requests.get(url).content))
        dframes.append(df)
print(dframes)

我想重命名它们而没有Filename (region).gba 标记。

如何使用标准命令行工具执行此操作?

2 个答案:

答案 0 :(得分:1)

尝试:

for f in *'('*')'*; do mv -i "$f" "${f/(*)/}"; done

或者,对于那些喜欢将命令分散到多行的用户:

for f in *'('*')'*
do
   mv -i "$f" "${f/(*)/}"
done

工作原理

  • for f in *'('*')'*; do

    这将开始循环搜索所有名称包含(后跟)的文件。

  • mv -i "$f" "${f/(*)/}"

    这将重命名那些文件,以删除括号和括号之间的所有内容。

    "${f/(*)/}"是称为模式替换的shell功能的示例。它会查找是否出现(*)字串,并将其替换为空字符串。有关更多详细信息,请参见man bash

    -i选项告诉mv无需询问就不要覆盖目标文件。这是可选的。您可能更喜欢制作备份副本。有关更多选项,请参见man mv

  • done

    这表明循环结束。

示例

让我们从包含以下文件的目录开始:

$ ls -1
Filename (region) 2.gba
Filename (region).gba

现在,让我们运行命令:

$ for f in *'('*')'*; do mv -i "$f" "${f//(*)/}"; done

我们的命令后,文件具有以下名称:

$ ls -1
Filename  2.gba
Filename .gba

答案 1 :(得分:0)

您可以使用(region)解决此问题。

sed

这将列出ls * | sed 's/\(.*\) \([(].*[)]\).*/mv "\1 \2.gba" "\1.gba"/g' 命令来移动文件。直通mvsh来执行。

说明:

  1. bash列出目录中的文件
  2. ls *将编辑传入的字符串。
  3. sed开始替换
  4. 's/与捕获组1中文件名的非区域部分匹配
  5. \(.*\)与文件名的其余部分(扩展名除外)匹配
  6. \([(].*[)]\).*组成/mv "\1 \2.ext" "\1.ext"/g'命令并结束替换。