Renomeando vários arquivos com base em seu conteúdo

4

Como posso renomear todos os arquivos em uma pasta com a primeira palavra do conteúdo deles? Por exemplo, se a.txt contiver “Unix is an OS” em sua primeira linha, então a.txt deve ser renomeado para Unix.txt

    
por anand babu 14.05.2011 / 10:37

6 respostas

7

Tente isto:

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

ou variante mais longa (como script):

#!/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

No caso de existir um ficheiro de destino, este one-liner salta-o.

    
por 14.05.2011 / 11:40
4

Aqui está a minha abordagem .

#!/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/.*\.\(.*\)/./g')
        [ "$file" != "$fileword" ] && $(mv  "$file"  "$fileword$ext")
    fi;
done
    
por 14.05.2011 / 11:55
1

Use este oneliner

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

Isso substituirá todos os arquivos pela primeira palavra desse arquivo + .txt . Eu defini primeira palavra como a primeira ocorrência de [a-zA-Z0-9]+ , descartando os espaços em branco iniciais.
Aviso: Por favor, use-a apenas se tiver certeza de que existe primeira palavra na linha um em cada arquivo! Caso contrário, você poderá ter resultados inesperados; -)

    
por 14.05.2011 / 12:45
0
for i in *.txt
do
d="$(head -1 "$i" | cut -d " " -f1).txt";
mv "$i" "$d"
done
    
por 14.06.2011 / 11:42
-1
for i in *.txt; do mv "$i" "$(head -1 "$i")".txt; done
    
por 14.06.2011 / 08:47
-2

Por sua conta e risco::)

find -exec echo -n mv {} " " ";" -exec sed '1s/ .*//;q' {} ";" > tmp.sh && bash tmp.sh

Isso funciona com nomes de arquivo fáceis, contendo palavras fáceis. Um arquivo "O'Reilly" contendo a primeira palavra "Eto'o" falhará. Miseravelmente.

    
por 20.05.2011 / 16:13

Tags