Pour rechercher un fichier avec un code de saut de ligne CR + LF sous le répertoire courant sous Linux ou Cygwin, procédez comme suit.
C'est la méthode utilisant grep. Vous avez spécifié -l pour afficher uniquement le nom de fichier dans grep. (Cette méthode inclut également le fichier binaire dans le résultat, mais cela peut être une recherche plus significative si vous spécifiez l'extension comme dans l'exemple 2)
Addendum (2014/06/23 19:10): Il était destiné à détecter CR + LF, mais
Actuellement, les commandes suivantes vont frapper même si seul CR est utilisé. Si vous trouvez un bon moyen, corrigez-le. </ del> j'ai trouvé un bon moyen de le réparer.
Addendum (2014/06/24 15:25): J'ai pu détecter CR + LF par la méthode trouvée par elfmimi.
Exemple 1
$ find . -type f | xargs grep -lzUP '\r\n'
Exemple 2
$ find . -name "*.java" | xargs grep -lzUP '\r\n'
Pour le moment, j'ai fait ma propre commande en langage C et je l'ai traitée (^ ー ^);
(De cette façon, </ del> inclut également les fichiers binaires dans le résultat)
Comment utiliser
$ gcc -o /usr/local/bin/crlf crlf.c
$ find . -type f | xargs crlf
crlf.c
#include <stdio.h>
int main(int argc, char **argv)
{
if(argc < 2) return 1;
int i;
for(i=1; i<argc; i++)
{
FILE *fp = fopen(argv[i], "r");
if(!fp) continue;
int last = 0;
int c = 0;
while((c=fgetc(fp)) != EOF)
{
if(last=='\r' && c=='\n')
{
printf("%s\n", argv[i]);
break;
}
last=c;
}
fclose(fp);
}
return 0;
}
La méthode consiste à retirer la sortie (sortie standard) lorsque la commande de fichier de Linux (ou Cygwin) est exécutée, et de sortir le nom de fichier si "avec terminateurs de ligne CRLF" est inclus. Vous pouvez exclure les fichiers binaires. (Avant de le faire dans le shell, j'ai essayé de le réaliser en utilisant les commandes en langage C pour le moment)
Comment utiliser
$ gcc -o /usr/local/bin/textcrlf textcrlf.c
$ find . -type f | xargs textcrlf
textcrlf.c
#include <stdio.h>
#include <string.h>
#define MAXLEN (1024)
int main(int argc, char **argv)
{
if(argc < 2) return 1;
int i;
for(i=1; i<argc; i++)
{
static char cmd[MAXLEN];
sprintf(cmd, "file %s", argv[i]);
FILE *fpin = popen(cmd, "r");
if(!fpin) continue;
static char line[MAXLEN];
if(!fgets(line, MAXLEN, fpin))
{
pclose(fpin);
continue;
}
if(strstr(line, "with CRLF line terminators"))
{
printf("%s\n", argv[i]);
}
pclose(fpin);
}
return 0;
}
J'ai également créé une commande en langage C pour trouver un fichier avec un code de saut de ligne de LF sur Linux (ou Cygwin). Cette commande dépend également de la sortie de la commande de fichier.
Comment utiliser
$ gcc -o /usr/local/bin/textlf textlf.c
$ find . -type f | xargs textlf
textlf.c
#include <stdio.h>
#include <string.h>
#define MAXLEN (1024)
int main(int argc, char **argv)
{
if(argc < 2) return 1;
int i;
for(i=1; i<argc; i++)
{
static char cmd[MAXLEN];
sprintf(cmd, "file %s", argv[i]);
FILE *fpin = popen(cmd, "r");
if(!fpin) continue;
static char line[MAXLEN];
if(!fgets(line, MAXLEN, fpin))
{
pclose(fpin);
continue;
}
if(strstr(line, "with CR line terminators"))
{
;
}
else if(strstr(line, "with CRLF line terminators"))
{
;
}
else if(strstr(line, "ASCII text"))
{
printf("%s\n", argv[i]);
}
pclose(fpin);
}
return 0;
}
Recommended Posts