J'ai un répertoire qui ressemble à ceci:Strip caractères avant la période Si Nom du fichier A Prefix Bash
pages/
folder1/
folder1.filename1.txt
folder1.filename2.txt
folder2/
folder2.filename4.txt
folder2.filename5.txt
folder3/
filename6.txt
Je veux qu'il ressemble à ceci:
pages/
folder1/
filename1.txt
filename2.txt
folder2/
filename3.txt
filename4.txt
folder3/
filename5.txt
Avec ls * | sed -e s/^[^.]*.// > /tmp/filenames.txt
je reçois un fichier contenant:
filename1.txt
filename2.txt
filename3.txt
filename4.txt
txt
Comment puis-je savoir sed ignorer les noms de fichiers de la forme [filename].[suffix]
et seulement regarder les noms de fichiers de la forme [foldername].[filename].[suffix]
?
Le script final (comme l'a souligné, la commande find simplifierait les choses, mais cela a fonctionné):
for folder in $(ls .)
do
if test -d $folder
then
pushd $folder
ls * | sed 's/.*\.\(.*\..*\)/\1/' > /tmp/filenames.txt
ls * > /tmp/current.txt
exec 3</tmp/current.txt
exec 4</tmp/filenames.txt
while read file <&3; read name <&4;
do
mv "$file" "$name"
done
rm /tmp/current.txt
rm /tmp/filenames.txt
popd
else
echo $folder "not a directory"
fi
done
exit 0
Cette page est maintenant un wiki communautaire. Vous pouvez ajouter des solutions plus élégantes ci-dessous:
for folder in $(ls .)
do
something better
Vous avez probablement/vouloir un 'pushd' quelque part là-dedans. –
Aussi vous voulez précisément "$ {folder}". préfixe supprimé, ou la première section d'un nom de fichier à trois blocs (séparés par des points)? –
@Douglas Oups, accidentellement retiré le pushd. Je l'ai remis dedans. Oui, c'est exactement ça. – terrace