Как вывести список всех файлов, где первая строка является пустой строкой

Я хотел бы найти все файлы Java, которые имеют пустую строку в качестве первой строки файла. У меня есть следующее, которое просто выводит первую строку (и имя файла) каждого файла в выходной файл "fileList.txt":

find . -name *java | xargs head -n1 > fileList.txt

Однако тогда мне нужно постобработать файл fileList.txt, чтобы найти пустые имена файлов.

Как я могу добавить условие "if" в xargs, чтобы оно выводило имя файла только в том случае, если первая строка пуста?

2 ответа

Решение

Нет необходимости использовать | xargsнайти есть -exec признак выполнения команды для соответствующих файлов. Кроме того, вам нужно избежать *java или Баш расширит аргументы и find будет жаловаться

это awk Затем он должен сделать то, что вам нужно:

find . -name '*java' -exec awk 'NR==1&&/^$/{print FILENAME}' {} \;

NR==1 выбирает только первую строку. /^$/ соответствует пустой строке. print FILENAME печатает файл, который соответствует.

Если первая строка не совсем пуста, но содержит только пробелы, вы можете изменить регулярное выражение в

/^\s*$/

где \s* соответствует 0 или более пробельных символов.

Вот альтернативное использование sed:

find . -name '*.java' -exec sed -n '/^$/F;q' {} \;

Обратите внимание, что это будет несколько неэффективно для большого количества маленьких файлов, так как он вызывает sed один раз для каждого файла - однако он читает только одну строку каждого.

Для обработки пустых строк, кроме пробелов, измените /^$/ в /^[[:blank:]]*$/ или же /^[ \t]*$/ (Космос-вкладка).

Другие вопросы по тегам