J'ai besoin d'une commande pour renommer tous les fichiers dans le répertoire de travail actuel, de manière à ce que le nouveau nom de fichier soit le même que l'ancien, mais en incluant un suffixe correspondant au nombre de lignes des fichiers d'origine (par exemple si le fichier f
a 10 alors il doit être renommé f_10
).
Voici ma tentative (non fonctionnelle):
linenum=$(wc -l); find * -type f | grep -v sh | rename 's/^/ec/'*
bash
batch-rename
Martin Yeboah
la source
la source
Réponses:
Que diriez-vous:
Par exemple:
Si vous souhaitez conserver les extensions (le cas échéant), utilisez-les à la place:
la source
_
. Quant au script, quel script? Cela devrait être exécuté à partir de la ligne de commande, il n'y a pas besoin de script. Si vous souhaitez uniquement qu'il corresponde à certains fichiers, remplacez lein *
par, par exemple,in *txt
ou quelque chose.wc -l < $f
qu'au lieu de la grep serait plus facile à comprendre (et peut-être mieux à effectuer mais je n'ai pas vérifié cela).wc
, je voulais montrer une approche différente. Mais OK, assez bien.Vous pouvez essayer cette doublure:
Cela trouvera tous les fichiers dans le répertoire de travail actuel (
find . -maxdepth 1 -type f
)Ensuite, nous exécutons une instance de shell sur les fichiers trouvés pour renommer les fichiers pour ajouter le nombre de lignes.
Exemple :
la source
Une autre manière qui préserve l'extension (si présente) en utilisant
rename
:Si le résultat est celui attendu, supprimez l'
-n
option:la source
rename
grand =) +1(\.?[^\.]+)
.(\.?[^\.]+)
n'est pas correct non plus car il ne correspondra qu'au deuxième point et ne correspondra pas à un nom de fichier avec des points consécutifs ou se terminant par un point malgré tout. Ce n'est pas une solution facile difficile, la seule façon semble faire deux substitutions..
intérieur des classes de personnages.En utilisant
find
:Exemple
la source
-name "*"
? Des restes de tests? ;)Juste pour le plaisir et glousse une solution avec
rename
. Puisqu'ilrename
s'agit d'un outil Perl qui accepte une chaîne arbitraire qui est évaluée, vous pouvez faire toutes sortes de manigances. Une solution qui semble fonctionner est la suivante:la source
Le script ci-dessous couvre plusieurs cas: le point unique et l'extension (file.txt), plusieurs points et extensions (file.1.txt), des points consécutifs (file..foobar.txt) et des points dans le nom de fichier (file. Or fichier..).
Le script
Script en action
Notez qu'il n'y a pas de lignes dans le fichier. et fichier .., donc le nombre de lignes est 0
Un merci spécial à Terdon et Helio pour avoir révisé le script et les modifications suggérées
la source
Un autre moyen bash, développé avec @Helio dans le chat :
Le type monocle à l'aspect étrange avec une deuxième tête rabougrie (
(.*)(\.[^.]+)$
) ne devrait correspondre qu'à des extensions appropriées (.foo
, pas..
). S'il n'y a pas d'extension, leBASH_REMATCH
tableau sera vide. Nous pouvons en profiter en utilisant une valeur par défaut pour le nom de fichier${BASH_REMATCH[1]:-$file}
et en utilisant simplement l'extension telle quelle.Pour gérer les fichiers dot, vous pouvez utiliser
find
, comme suggéré par terdon et Helio .la source