コンテンツに応じて複数のファイルの名前を変更する

コンテンツに応じて複数のファイルの名前を変更する

コンテンツの最初の単語を使用してフォルダ内のすべてのファイル名を変更するには?たとえば、a.txtの最初の行に「Unixは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

ターゲットファイルが存在する場合、この1行はそのファイルをスキップします。

答え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

関連情報