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