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.