我有一個包含50,000多個文件的目錄結構。文件名的格式爲<YYMMDD>-<NNN>.htm
。需要拼合一個目錄,修改文件名。用bash?
目錄結構
/<category>/<YYYY>/<MM>/
例如:
./Racing/1998/03/980320-001.htm
./Racing/1998/03/980320-002.htm
...
./General/1999/02/990221-001.htm
./General/1999/02/990221-002.htm
...
我想要的文件的扁平列表的形式爲
<category>-<YYYY>-<MM>-<DD>-<NNN>
所以以上是
Racing-1998-03-20-001.htm
Racing-1998-03-20-002.htm
...
General-1999-02-21-001.htm
General-1999-02-21-002.htm
我(重新)學習慶典&正則表達式,並希望就如何落實這一些指針。
我知道如何生成路徑列表,但不知道如何應用正則表達式來轉換窗體。我會提前使用find -type f -name "*.htm" | <some goblygook here>
其中<some goblygook here>
可能利用xargs
...
感謝。
[編輯3/30下午9點58分]
每答案在下面,我炮製這個腳本。我不能讓xargs
工作:
#!/bin/bash
mkdir ./flat
find -type f -name "*.htm" | \
awk -F'[/]' '
BEGIN{OFS="-"}
{ gsub(/^\.\//,"") ;print "./" $0 " ./flat/" $1,$2, substr($4,3,2),substr($4,5,2),substr($4,8)}
' | \
xargs -p -d "\n" -n 1 cp
運行這給了我:
$ ./awktest.sh
mkdir: cannot create directory `./flat': File exists
cp ./General/1997/05/970525-002.htm ./flat/General-1997-05-25-002.htm ?...y
cp: missing destination file operand after `./General/1997/05/970525-002.htm ./flat/General-1997-05-25-002.htm'
Try `cp --help' for more information.
^C
複製從輸出的精確cp
命令(cp ./General/1997/05/970525-002.htm ./flat/General-1997-05-25-002.htm
)和直接粘貼到bash提示符下正常工作。
我試圖搞清楚如何使用-print0
在find
命令,但無法弄清楚如何讓awk
使用\0
作爲記錄終止(RS="\0"
是行不通的)。我認爲這個問題與換行符有關,但我很茫然!
值得指出的是,有一個很好的理由說明爲什麼目錄結構是這樣的,而不是平坦的 - 如果最終在一個目錄中有太多的文件,很多文件系統性能不佳,而且使用標準工具的目錄變得很笨重。 – caf 2011-03-31 05:53:40
@caf - 謝謝。實際上,我將其作爲亞馬遜S3的測試來完成,在這裏我想要在我的存儲桶中包含許多文件。 – tig 2011-03-31 06:07:35