根据内容重命名多个文件

根据内容重命名多个文件

如何使用其内容的第一个单词重命名文件夹中的所有文件?例如,如果 a.txt 第一行包含“Unix is an OS”,则 a.txt 应重命名为 Unix.txt

答案1

尝试这个:

for f in *.txt; do d="$(head -1 "$f" | awk '{print $1}').txt"; if [ ! -f "$d" ]; then mv "$f" "$d"; else echo "File '$d' already exists! Skiped '$f'"; fi; done

或更长的变体(作为脚本):

#!/bin/sh
for f in *.txt; do
    d="$(head -1 "$f" | awk '{print $1}').txt"
    if [ ! -f "$d" ]; then
        mv "$f" "$d"
    else
        echo "File '$d' already exists! Skiped '$f'"
    fi
done

如果目标文件存在,则此单行代码会跳过它。

答案2

这是我的方法

#!/bin/bash
for file in *; 
do
    if [[ -f $file ]]; 
    then
        # cut word by single white space
        fileword=$(head -n1 "$file" | cut -f1 -d" ");
        # Everything after first dot is considered as extention
        ext=$(echo $file | sed 's/.*\.\(.*\)/.\1/g')
        [ "$file" != "$fileword" ] && $(mv  "$file"  "$fileword$ext")
    fi;
done

答案3

用这个内线

for i in *; do if [ ! -f $i ]; then echo "skipping $i"; else newname=`head -1 $i | sed 's/^\s*\([a-zA-Z0-9]\+\).*$/\1/'`; [ -n "$newname" ] && mv -i $i $newname.txt || echo "error at: $i"; fi; done

这会将所有文件替换为该文件中的第一个单词 + .txt。我定义了第一个字成为 的第一次出现[a-zA-Z0-9]+,丢弃前导空格。
免责声明:如果您确定有,请使用它第一个字在每个文件的第一行!否则你可能会遇到意想不到的结果;-)

答案4

for i in *.txt; do mv "$i" "$(head -1 "$i")".txt; done

相关内容