2016-02-01 45 views
0

我有一個類似(幾乎相同)的問題,如(Keep latest file and delete all other) 除了我的文件列表不同,我不知道Python(試圖做到這一點在bash)的搜索類似的重複文件名(不同的日期戳文件末尾)

該目錄包含文件像這樣的例子:

mysql-2016-01-24/  *<-- dirname* 
    adsoglasi-2016-01-24-05.35.gz 
    adsoglasi-2016-01-24-09.35.gz 
    adsoglasi-2016-01-24-13.35.gz 
    adsoglasi-2016-01-24-17.35.gz 
    adsoglasi-2016-01-24-21.35.gz 
    ehoplit-2016-01-24-05.35.gz 
    ehoplit-2016-01-24-09.35.gz 
    ehoplit-2016-01-24-13.35.gz 
    ehoplit-2016-01-24-17.35.gz 
    ehoplit-2016-01-24-21.35.gz 
    posavje-2016-01-24-05.35.gz 
    posavje-2016-01-24-09.35.gz 
    posavje-2016-01-24-13.35.gz 
    posavje-2016-01-24-17.35.gz 
    posavje-2016-01-24-21.35.gz 
    export-mysql-baze-2016-01-24-05.35.log 
    export-mysql-baze-2016-01-24-09.35.log 
    export-mysql-baze-2016-01-24-13.35.log 
    export-mysql-baze-2016-01-24-17.35.log 
    export-mysql-baze-2016-01-24-21.35.log 
    flora-2016-01-24-05.35.gz 
    flora-2016-01-24-09.35.gz 
    flora-2016-01-24-13.35.gz 
    flora-2016-01-24-17.35.gz 
    flora-2016-01-24-21.35.gz 
    karcher-2016-01-24-05.35.gz 
    karcher-2016-01-24-09.35.gz 
    karcher-2016-01-24-13.35.gz 
    karcher-2016-01-24-17.35.gz 
    karcher-2016-01-24-21.35.gz 
    knjigarna-2016-01-24-05.35.gz 
    knjigarna-2016-01-24-09.35.gz 
    knjigarna-2016-01-24-13.35.gz 
    knjigarna-2016-01-24-17.35.gz 
    knjigarna-2016-01-24-21.35.gz 
    mysql-2016-01-24-05.35.gz 
    mysql-2016-01-24-09.35.gz 
    mysql-2016-01-24-13.35.gz 
    mysql-2016-01-24-17.35.gz 
    mysql-2016-01-24-21.35.gz 
    mysqlshow_grants-2016-01-24-05.36.49.gz 
    mysqlshow_grants-2016-01-24-09.36.50.gz 
    mysqlshow_grants-2016-01-24-13.36.48.gz 
    mysqlshow_grants-2016-01-24-17.36.48.gz 
    mysqlshow_grants-2016-01-24-21.36.49.gz 
    pohistvo-2016-01-24-05.35.gz 
    pohistvo-2016-01-24-09.35.gz 
    pohistvo-2016-01-24-13.35.gz 
    pohistvo-2016-01-24-17.35.gz 
    pohistvo-2016-01-24-21.35.gz 
    akord-2016-01-24-05.36.gz 
    akord-2016-01-24-09.36.gz 
    akord-2016-01-24-13.36.gz 
    akord-2016-01-24-17.36.gz 
    akord-2016-01-24-21.36.gz 
    ekomprof-2016-01-24-05.36.gz 
    ekomprof-2016-01-24-09.36.gz 
    ekomprof-2016-01-24-13.36.gz 
    ekomprof-2016-01-24-17.36.gz 
    ekomprof-2016-01-24-21.36.gz 
    gume-2016-01-24-05.36.gz 
    gume-2016-01-24-09.36.gz 
    gume-2016-01-24-13.36.gz 
    gume-2016-01-24-17.36.gz 
    gume-2016-01-24-21.36.gz 
    orchestra_test-2016-01-24-05.36.gz 
    orchestra_test-2016-01-24-09.36.gz 
    orchestra_test-2016-01-24-13.36.gz 
    orchestra_test-2016-01-24-17.36.gz 
    orchestra_test-2016-01-24-21.36.gz 

,這是每天都在做單獨迪爾斯

mysql-2015-11-16/ 
mysql-2015-11-19/ 

-- || -- 

mysql-2016-01-18/ 
mysql-2016-01-19/ 
mysql-2016-01-20/ 
mysql-2016-01-21/ 
mysql-2016-01-22/ 
mysql-2016-01-23/ 
mysql-2016-01-24/ 
... 

我在尋找什麼該目錄將只保留最新的日期&時間的文件名,和每一個「重複」類似的文件刪除(他們雜亂的空間),

我希望得到的輸出:

mysql-2015-11-16/ 
       adsoglasi-2016-01-16-21.35.gz 
       ehoplit-2016-01-16-21.35.gz 
       posavje-2016-01-16-21.35.gz 
       export-mysql-baze-2016-01-16-21.35.log 
       flora-2016-01-16-21.35.gz 
       karcher-2016-01-16-21.35.gz 
       knjigarna-2016-01-16-21.35.gz 
       mysql-2016-01-16-21.35.gz 
       mysqlshow_grants-2016-01-16-21.36.49.gz 
       pohistvo-2016-01-16-21.35.gz 
       akord-2016-01-16-21.36.gz 
       ekomprof-2016-01-16-21.36.gz 
       gume-2016-01-16-21.36.gz 
       orchestra_test-2016-01-16-21.36.gz 
-- || -- 
mysql-2015-11-19/ 
       ....filenames with date ...2015-11-19... 
-- || -- 
mysql-2016-01-24/ 
       adsoglasi-2016-01-24-21.35.gz 
       ehoplit-2016-01-24-21.35.gz 
       posavje-2016-01-24-21.35.gz 
       export-mysql-baze-2016-01-24-21.35.log 
       flora-2016-01-24-21.35.gz 
       karcher-2016-01-24-21.35.gz 
       knjigarna-2016-01-24-21.35.gz 
       mysql-2016-01-24-21.35.gz 
       mysqlshow_grants-2016-01-24-21.36.49.gz 
       pohistvo-2016-01-24-21.35.gz 
       akord-2016-01-24-21.36.gz 
       ekomprof-2016-01-24-21.36.gz 
       gume-2016-01-24-21.36.gz 
       orchestra_test-2016-01-24-21.36.gz 

...現在是不是一個更好的名單:-)

但因爲我沒有與一些「工具」像fdupes或任何類似的成功,我要求向專家求助。

TY, 最好的問候。

+1

爲什麼有多個'出口的mysql-baze'?這裏的「只有最新的」規則不適用嗎? –

+0

@Benjamin W.:......應該是,我正在手動編輯(刪除)這些行。列表已更正。 –

回答

0

幸運的是,這些日期戳是用ISO表示法,年月日,因此簡單地ascii排序,也是日期排序。這使得這些事情變得簡單。只要依靠「ls」排序就可以獲得正確順序的文件,然後我們就可以讀取它們,比較日期之前的部分,如果前一部分具有相同的基本部分,那麼我們可以刪除前一部分。

假設這些文件夾中的所有文件都具有該模式(特別是如果在基本名稱部分中不存在「dash-year-dash」模式 - 如果不確定,則必須使正則表達式更長確保只匹配日期+序列+擴展名)。首先,讓我們看看有什麼會被移除,這樣的文件夾內執行:

ls | perl -nle '($b)=m{^(.*?)-2\d\d\d-.*}; print $fn if $fn && $b eq $p_b; $p_b=$b; $fn=$_;' 

要真正刪除這些文件只是與「取消」的聲明取代了「打印」:

ls | perl -nle '($b)=m{^(.*?)-2\d\d\d-.*}; unlink $fn if $fn && $b eq $p_b; $p_b=$b; $fn=$_;' 

要做到這一點在所有這些文件夾,CD到具有所有的mysql-YYYY-MM-DD文件夾的父文件夾:

for d in mysql*; do (cd $d; 
    ls | perl -nle '($b)=m{^(.*?)-2\d\d\d-.*}; unlink $fn if $fn && $b eq $p_b; $p_b=$b; $fn=$_;' 
); done 

- 編輯 -

顯然你有別名「ls」到「ls -l」。爲了避免「LS」完全:

find . -maxdepth 1 -type f -print0 | sort | perl -0x00 -ne '($b)=m{^(.*?)-2\d\d\d-.*}; unlink $fn if $fn && $b eq $p_b; $p_b=$b; $fn=$_;' 

但是當你甚至不知道所有的文件你喂輸入有沒有預期的格式,那麼也許你應該在什麼樣的文件的方式更具體句柄以及要排除的文件。現在,該模式假定模式「-2 \ d \ d \ d-」(短劃線,數字2,後面跟着3個數字,後面跟着破折號)必須存在於文件名中,並且該部分開始日期戳記。

E.g.以格式'-YYYY-MM-DD-'(包括破折號之前的破折號)匹配完整日期,儘可能到名稱末尾;

find . -maxdepth 1 -type f -print0 | sort | 
perl -0x00 -ne '($b)=m{^(.*)-2\d\d\d-\d\d-\d\d-.*}; unlink $fn if $fn && $b eq $p_b; $p_b=$b; $fn=$_;' 

在此之前的任何事情都被認爲是比較的基礎;那個日期和之後的東西被認爲是「模糊」的部分,只用於排序。

+0

你不需要或需要'ls'在這裏。 shell將按字母順序展開任何通配符。另見http://mywiki.wooledge.org/ParsingLs – tripleee

+0

@tripleee:使用「find」: 查找./ -type f -printf「%f \ n」|排序| perl-nle'($ b)...當我獲得一些輸出時,它看起來很有前景。 –

0

@PBI:

不幸的是,這

ls | perl -nle '($b)=m{^(.*?)-2\d\d\d-.*}; print $fn if $fn && $b eq $p_b; $p_b=$b; $fn=$_;' 

不產生任何輸出想要的(這是實際輸出):

total 569356 
drwxr-xr-x 2 root root  4096 Jan 17 21:36 ./ 

的 「LS」 輸出:

-- || -- 
-rw-r--r-- 1 root root 22247827 Jan 17 05:35 akord-2016-01-17-05.35.gz 
-rw-r--r-- 1 root root 22266602 Jan 17 09:35 akord-2016-01-17-09.35.gz 
-rw-r--r-- 1 root root 22287951 Jan 17 13:35 akord-2016-01-17-13.35.gz 
-rw-r--r-- 1 root root 22248103 Jan 17 17:35 akord-2016-01-17-17.35.gz 
-- || -- 

打印在行的開始處列出文件大小和所有者,這會混淆Perl來排序文件名。

但是...... 「查找」 命令打印出漂亮東西預計:

find ./ -type f -printf "%f\n" | sort | perl -nle '($b)=m{^(.*?)-2\d\d\d-.*}; print $fn if $fn && $b eq $p_b; $p_b=$b; $fn=$_;' 

adsoglasi-2015-12-17-05.35.gz 
adsoglasi-2015-12-17-09.35.gz 
adsoglasi-2015-12-17-13.35.gz 
adsoglasi-2015-12-17-17.35.gz 

究竟是什麼它應該打印出來,而不是「源」的文章:

adsoglasi-2015-12-17-05.35.gz 
adsoglasi-2015-12-17-09.35.gz 
adsoglasi-2015-12-17-13.35.gz 
adsoglasi-2015-12-17-17.35.gz 
adsoglasi-2015-12-17-21.35.gz 

現在最後一個文件被省略(yaaay :-),因此它產生的列表文件被刪除!非常好 !

重要說明!

「找......」不「排序」也做它(據我所知)保持在Perl「緩衝」不輸出任何用處,只是一個文件名

+0

然後,您已將「ls」別名爲「ls -l」。 爲避免使用別名,請執行「\ ls」 – PBI

+0

的確,「\ ls」完成了這項工作(順便說一句,誰不會混淆「ls」:-) –