如何創建大量文本文件,其中包括特定目錄中文件的文件名,每個文本文件最多999行?在Bash中每個文本文件的列表文件名達到最大值
我從此開始:
find ./J0902-405/*.evt -maxdepth 1 -type f -fprintf files_xselect.list %f\\n
而且它在文本文件中寫入正確的文件名。 但後綴,我需要把999行限制,並在此限制之後,創建具有以下999名稱的另一個文本文件,依此類推,直到列出所有* .evt文件。
如何創建大量文本文件,其中包括特定目錄中文件的文件名,每個文本文件最多999行?在Bash中每個文本文件的列表文件名達到最大值
我從此開始:
find ./J0902-405/*.evt -maxdepth 1 -type f -fprintf files_xselect.list %f\\n
而且它在文本文件中寫入正確的文件名。 但後綴,我需要把999行限制,並在此限制之後,創建具有以下999名稱的另一個文本文件,依此類推,直到列出所有* .evt文件。
@ 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
導致用於輸出文件數值後綴(00
,01
,...),而不是默認的字母(aa
,ab
,...)[注:將無法正常工作在OSX上];默認後綴長度是2;控制數字/字符的數量。在後綴中,使用-a {length}
。-
導致split
從標準輸入讀取 - 在這種情況下,從find
輸出。files_xselect.list.
是輸出文件前綴;因此,我們得到的文件files_xselect.list.00
,files_xselect.list.01
,...如果你想在輸出文件名更多的控制 - 例如,向後綴的數據移動到文件名的不同部分 - 你可以使用--filter
選項(注意:在OS X上不起作用),它接受一個shell命令,每個文件的輸出數據都被傳送到該命令,以及包含相應輸出文件名稱的變量$FILE
;這使您有機會基於它修改輸出文件名:
例如,要創建名爲files_xselect.00.list
的輸出文件,即......,以將後綴數據文件擴展名之前,你會使用:
... | split -l 999 -d --filter='> ${FILE}.list' - 'files_xselect.'
喜歡的東西
#!/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
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
+1從來沒有聽說過分裂之前,學習的東西,每天就知道了。 – BroSlow
這在POSIX中是非常真實的,大多數情況下,已經有了工作的工具,可以獲得足夠簡單的'$ JOB'值。 (: – DopeGhoti