Supprimer les retours à la ligne dans les noms de fichiers

9

J'ai un code PHP qui génère le nom du fichier sur lequel wget ajoutera ses journaux. J'ai généré plus de 2000 fichiers, mais le problème est que j'ai du mal à travailler avec eux parce que j'ai eu une erreur de mettre PHP_EOLdans le cadre de son nom, ce code ajoutera LF/line feed/%0Aà son nom

Exemple d'un tel nom de fichier (lorsqu'il est accessible via un navigateur, lorsqu'il est placé sur / var / www / html), http://xxxx/wget_01_a%0a.txtnotez %0aavant le nom de l'extension

J'ai foiré, et je souhaite qu'il y ait un lot de renommage qui recherchera tous les fichiers et s'il le trouve, line feedil le renommerait sans le saut de ligne, il serait donc justehttp://xxxx/wget_01_a.txt

Je ne sais pas trop comment gérer cela, car il semble que lorsque je mets lsdu mastic, tout caractère spécial non limité à ce caractère indésirable devient ?, ce que je souhaite uniquement cibler, c'est ce saut de ligne.

arvil
la source

Réponses:

12

Utilisation de l'utilitaire renameutil-linux, fourni par CentOS 6, et en supposant que bash:

rename $'\n' '' wget_*

Cela demande de supprimer les caractères de nouvelle ligne des noms des fichiers répertoriés. Je recommande de l'essayer sur un petit sous-ensemble pour vous assurer qu'il fait ce que vous voulez (notez que renamesur CentOS 7 prend en charge un -vcommutateur pour vous montrer les changements qu'il apporte).

Si au lieu de cela vous étiez sur une distribution qui fournit la base Perl rename:

rename -n 's/\n//g' wget_*

Et puis exécutez sans -npour réellement effectuer le changement de nom.

dhag
la source
bro, rien ne s'est passé pastebin.com/NjMg8vTL J'utilise centos 6
arvil
Peut-être que le caractère de saut de ligne que vous avez n'est pas réellement \n? Pouvez-vous faire quelque chose comme l'écho *.txt | od -cpour que nous voyions quel caractère réel non imprimable existe-t-il?
dhag
semble comme \n pastebin.com/wXCDCJjr
arvil
Je ne suis pas sûr de ce qui ne va pas, à moins que pour une raison quelconque le fichier de votre pâte précédente ne corresponde pas *.txt(ce qui expliquerait pourquoi renamene le ramasse pas). Si vous définissez les deux modèles sur, disons, txtau lieu de $'\n'et '', obtenez-vous une sortie? Echo $ '\ n' affiche-t-il effectivement deux nouvelles lignes?
dhag
1
Je devais l'utiliser rename $'\r' '' wget_*pour que ça marche
rshdev
2

Sur la base de ce qui a déjà été répondu, je l'ai généralisé pour renommer tous les fichiers contenant des sauts de ligne dans le dossier et le sous-dossier actuels, en combinant la commande find avec rename -

find -name $'*\n*' -exec rename  $'s|\n| |g' '{}' \;

Ici, la commande find localise tous les fichiers contenant un saut de ligne et la commande renommer remplace chaque saut de ligne du nom par un espace.

La même chose peut être effectuée pour tout autre caractère problématique tel que le retour chariot (\ r).

Prasad Bhat
la source