2013-04-03 65 views
0

我在想如果有一種簡單的方法來檢查包含超過一定數量字符的行的目錄中的文件。例如,我有一個包含10000個文件的目錄,我希望看到哪些文件至少有一行超過1000個字符。是否有可能通過批處理腳本檢查此問題?謝謝。如何檢查文件中的行是否超過字符數

這是Windows 7企業版,64位,Service Pack 1的

回答

4

最簡單和最快的方式是使用從在的GnuWin32 grepbinary。我相信這句法會工作:

grep -Pl ".{1000}" * 

如果找到匹配將執行在*包含1000個字符的任何行一個Perl的語法正則表達式搜索,並輸出文件名。

完全可以用純批處理腳本來完成你所要求的,但是一個for循環通過10,000個文件循環遍歷每個知道多少行,將永遠耗費一天。


確定Pickle教授,這是您的批處理文件。我使用variable substring extraction來提高速度。另外,如果遇到有1000個字符的行,請立即移動到下一個文件。我仍然認爲grep會更快更簡單。 o°/

@echo off 
setlocal enabledelayedexpansion 
for %%a in (*) do (
    call :look "%%a" 
) 

goto :EOF 

:look 
for /f "usebackq delims=" %%I in ("%~1") do (
    set "line=%%I" 
    if "!line:~999,1!" neq "" echo %~1 && exit /b 
) 
+0

當然,它也沒有太多要求獲得全批次解決方案。無論如何,+1試圖快速創建批處理文件。 –

+0

@ProfPickle - 你走了。 – rojo

+0

這個問題真的很好的批量構思,+1 – Endoro

2

純批:

@echo off&setlocal enabledelayedexpansion 

for %%a in (*.txt) do (
for /f "tokens=1-2delims=:" %%i in ('"cmd /c type "%%~a" ^&echo(|findstr /no ^^"') do (
    set "pos1=!pos0!"&set "line1=!line0!" 
    set "pos0=%%j"&set "line0=%%i" 
    set /a length=!pos0!-!pos1!-2 
    if !length! gtr 1000 echo line: !line1! length: !length! in file: %%~a 
)) 

更改* .TXT到您想要的搜索模式。

編輯:小改進(^^)。

+0

+1,這應該有效,但有2個限制:文件大小必須小於2千兆字節,並且行必須使用Windows風格(以CR/LF結尾),而不是Unix風格(以LF結尾)。 Unix樣式文件的行長度會減1。 – dbenham

0

我發現了一個臨時文件更快的解決方案:

@echo off&setlocal enabledelayedexpansion 
set "tempfile=%temp%\%random%" 
for %%a in (*.txt) do (
<"%%~a">"%tempfile%" more 
echo(>>"%tempfile%" 
for /f "tokens=1-2delims=:" %%i in ('^"^< "%tempfile%" findstr /no "^" ^"') do (
    set "pos1=!pos0!"&set "line1=!line0!" 
    set "pos0=%%j"&set "line0=%%i" 
    set /a length=!pos0!-!pos1!-2 
    if !length! gtr 0 echo line: !line1! length: !length! in file: %%~a 
)) 
del "%tempfile%" >nul 2>&1 

編輯:改善轉義XP。

相關問題