我有以下格式的文件名列表:
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
标记。
如何使用标准命令行工具执行此操作?
答案 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'
命令来移动文件。直通mv
或sh
来执行。
说明:
bash
列出目录中的文件ls *
将编辑传入的字符串。sed
开始替换's/
与捕获组1中文件名的非区域部分匹配\(.*\)
与文件名的其余部分(扩展名除外)匹配\([(].*[)]\).*
组成/mv "\1 \2.ext" "\1.ext"/g'
命令并结束替换。