Как вывести список всех файлов, где первая строка является пустой строкой
Я хотел бы найти все файлы 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]*$/ (Космос-вкладка).