我需要重命名文件夹,新名称位于每个文件夹内的 txt 文件中

我需要重命名文件夹,新名称位于每个文件夹内的 txt 文件中

我需要一些帮助。

我有一堆文件夹,名称不具有描述性。

每个文件夹内都有一个包含多行的“info.txt”文件,但我对其中两行感兴趣:

artist = Name of the Band
name = Name of the Song

我想用以下结构重命名每个文件夹:

Name of the Band - Name of the Song

我想 find、grep 和 mv 命令的某种组合可以解决问题,但我没有足够的经验来自己想出正确的脚本或命令。

提前致谢!

答案1

另一种方法可以做到这一点(假设 GNU 实用程序)。如果此测试良好,请删除echo并运行它。

#!/bin/sh -
for f in */info.txt; do
    a="$(grep -Pom1 -- "(?<=^artist = ).*" "$f")"
    n="$(grep -Pom1 -- "(?<=^name = ).*" "$f")"
    echo mv -T -- "${f%/*}" "$a - $n"
done

这里也-T不错。默认行为是,mv如果目标不存在,则重命名目录;如果目标存在,则将整个目录移动到目标内。因此,-T如果在此期间存在任何现有目标,则不会移动任何内容。

我假设所有目录都位于同一深度,并且您必须从上一层运行它。

答案2

这是另一种方法,不需要info.txt多次读取文件:

#!/usr/bin/env bash

## Give a list of target folders in the command line
for dir in "$@"; do
  . <(awk -F'=' '$1=="artist" || $1=="name"{
                      sub(/^ /,"",$2); 
                      print $1"=\""$2"\""
                 }' "$dir/info.txt")
  mv -- "$dir" "$artist - $name"
done

将其另存为foo.sh,使其可执行,然后运行:

foo.sh path/to/dir1 path/to/dir2 ... path/to/dirN

或者直接在终端中运行:

for dir in path/to/dir1 path/to/dir2 ... path/to/dirN; do
  . <(awk -F'=' '$1=="artist" || $1=="name"{
                      sub(/^ /,"",$2); 
                      print $1"=\""$2"\""
                 }' "$dir/info.txt")
  mv -- "$dir" "$artist - $name"
done

答案3

如果我理解正确的话,让我们看看这是否适合您:

for i in /path/to/your/dirs/*/info.txt; do
  band=$(awk -F'= ' '/^artist/ { print $2 }' "$i")
  
  song=$(awk -F'= ' '/^name/ { print $2 }' "$i")
  
  folder_name="$band - $song"  

  mv "$(dirname "$i")" "$folder_name"
done

相关内容