我需要一些帮助。
我有一堆文件夹,名称不具有描述性。
每个文件夹内都有一个包含多行的“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