Renommer plusieurs files en fonction de leur contenu

Comment puis-je renommer tous les files d'un dossier avec le premier mot de leur contenu? Par exemple, si a.txt contient "Unix est un OS" sur sa première ligne, alors a.txt doit être renommé en Unix.txt

Essaye ça:

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 plus longue (comme 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 

Dans le cas où le file de destination existe, ce one-liner le saute.

Voici mon approche .

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

Utilisez cet oneliner

 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 

Cela replacea tous les files avec le premier mot dans ce file + .txt . J'ai défini le premier mot comme la première occurrence de [a-zA-Z0-9]+ , rejetant les principaux espaces blancs.
Clause de non-responsabilité: Veuillez l'utiliser si vous êtes sûr qu'il y a un premier mot sur la première ligne dans chaque file! Sinon, vous pourriez rencontrer des résultats inattendus 😉

 for i in *.txt do d="$(head -1 "$i" | cut -d " " -f1).txt"; mv "$i" "$d" done 
 for i in *.txt; do mv "$i" "$(head -1 "$i")".txt; done 

A vos risques et périls: 🙂

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

Cela fonctionne avec des noms de files faciles, contenant des mots faciles. Un file "O'Reilly" contenant comme premier mot "Eto'o" échouera. Misérablement.