2014-01-24 66 views
1

如何創建大量文本文件,其中包括特定目錄中文件的文件名,每個文本文件最多999行?在Bash中每個文本文件的列表文件名達到最大值

我從此開始:

find ./J0902-405/*.evt -maxdepth 1 -type f -fprintf files_xselect.list %f\\n 

而且它在文本文件中寫入正確的文件名。 但後綴,我需要把999行限制,並在此限制之後,創建具有以下999名稱的另一個文本文件,依此類推,直到列出所有* .evt文件。

回答

1

@ DopeGhoti的答案是正確的做法,但讓我割肉出來一點,對於那些新到split(像我一樣):

find ./J0902-405 -maxdepth 1 -name '*.evt' -type f -printf '%f\n' | \ 
    split -l 999 -d - files_xselect.list. 
  • -name ...引述文件名模式讓找到做路徑擴展(而不是外殼 - 沒有任何意義,讓這兩個殼find做的工作)。
  • -printf '%f\n'確保只輸出文件名(無路徑組件),如OP中所示。
  • -l 999指定行的分割大小;默認值是1000
  • -d導致用於輸出文件數值後綴(0001,...),而不是默認的字母(aaab,...)[注:將無法正常工作在OSX上];默認後綴長度是2;控制數字/字符的數量。在後綴中,使用-a {length}
  • -導致split從標準輸入讀取 - 在這種情況下,從find輸出。
  • files_xselect.list.是輸出文件前綴;因此,我們得到的文件files_xselect.list.00files_xselect.list.01,...

如果你想在輸出文件名更多的控制 - 例如,向後綴的數據移動到文件名的不同部分 - 你可以使用--filter選項(注意:在OS X上不起作用),它接受一個shell命令,每個文件的輸出數據都被傳送到該命令,以及包含相應輸出文件名稱的變量$FILE;這使您有機會基於它修改輸出文件名:

例如,要創建名爲files_xselect.00.list的輸出文件,即......,以將後綴數據文件擴展名之前,你會使用:

... | split -l 999 -d --filter='> ${FILE}.list' - 'files_xselect.' 
1

喜歡的東西

#!/bin/bash 

for file in ./J0902-405/*.evt; do 
    [[ $i > 999 ]] && i=0 && j=$((j+1)) 
    [[ -f $file ]] && i=$((i+1)) && echo "${file##*/}" >> "fileofnames$j.txt" 
done 
5

find ./J0902-405/*.evt -maxdepth 1 -type f | split -l999 -

從手冊頁:

NAME 
    split - split a file into pieces 

SYNOPSIS 
    split [OPTION]... [INPUT [PREFIX]] 

DESCRIPTION 
    Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000 
    lines, and default PREFIX is `x'. With no INPUT, or when INPUT is -, read standard 
    input. 

    -l, --lines=NUMBER 
      put NUMBER lines per output file 
+2

+1從來沒有聽說過分裂之前,學習的東西,每天就知道了。 – BroSlow

+0

這在POSIX中是非常真實的,大多數情況下,已經有了工作的工具,可以獲得足夠簡單的'$ JOB'值。 (: – DopeGhoti

相關問題