Gehen Sie wie folgt vor, um eine Datei mit dem Zeilenvorschubcode CR + LF im aktuellen Verzeichnis unter Linux oder Cygwin zu finden.
Dies ist die Methode mit grep. Sie haben -l angegeben, um nur den Dateinamen in grep anzuzeigen. (Diese Methode enthält auch die Binärdatei im Ergebnis, kann jedoch eine aussagekräftigere Suche sein, wenn Sie die Erweiterung wie in Beispiel 2 angeben.)
Nachtrag (23.06.2014 19:10): Es war beabsichtigt, CR + LF zu erkennen, aber
Derzeit werden die folgenden Befehle auch dann ausgeführt, wenn nur CR verwendet wird. Wenn Sie einen guten Weg finden, beheben Sie ihn. </ del> Ich habe einen guten Weg gefunden, dies zu beheben.
Nachtrag (24.06.2014 15:25): Ich konnte CR + LF mit der von elfmimi gefundenen Methode erkennen.
Beispiel 1
$ find . -type f | xargs grep -lzUP '\r\n'
Beispiel 2
$ find . -name "*.java" | xargs grep -lzUP '\r\n'
Vorerst habe ich mein eigenes Kommando in C-Sprache gemacht und mich damit befasst (^ ー ^);
(Auf diese Weise enthält </ del> auch Binärdateien im Ergebnis.)
Wie benutzt man
$ 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;
}
Die Methode besteht darin, die Ausgabe (Standardausgabe) herauszunehmen, wenn der Dateibefehl von Linux (oder Cygwin) ausgeführt wird, und den Dateinamen auszugeben, wenn "mit CRLF-Zeilenabschlusszeichen" enthalten ist. Sie können Binärdateien ausschließen. (Bevor ich es in der Shell gemacht habe, habe ich versucht, es vorerst mithilfe von C-Sprachbefehlen zu realisieren.)
Wie benutzt man
$ 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;
}
Ich habe auch einen C-Sprachbefehl erstellt, um eine Datei mit dem Zeilenvorschubcode LF unter Linux (oder Cygwin) zu finden. Dieser Befehl hängt auch von der Ausgabe des Dateibefehls ab.
Wie benutzt man
$ 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