2016-07-28 66 views
1

我有一些目錄具有以下結構:grep的用於兩個模式獨立地(在不同的行)

DAY1/ # Files under this directory should have DAY1 in the name. 
|-- Date 
| |-- dir1 # Something wrong here, there are files with DAY2 and files with DAY1. 
| |-- dir2 
| |-- dir3 
| |-- dir4 
DAY2/ # Files under this directory should all have DAY2 in the name. 
|-- Date 
| |-- dir1 
| |-- dir2 # Something wrong here, there are files with DAY2, and files with DAY1. 
| |-- dir3 
| |-- dir4 

在每dir有文件數十萬用含有DAY名稱,例如0.0000.DAY1.01927492。名稱上只有DAY1的文件應該只出現在父目錄DAY1下。

複製文件時發生錯誤,所以我現在在dir的某些目錄中有DAY1DAY2的混合文件。

我寫了一個腳本來查找包含混合文件的文件夾,因此我可以更仔細地查看它們。我的腳本如下:

for directory in */; do 
    if ls $directory | grep -q DAY2 ; then 
     if ls $directory | grep -q DAY1; then 
       echo "mixed files in $directory"; 
     fi ; 
    fi; 
done 

這裏的問題是,我經歷的所有文件兩次,這是沒有意義的考慮,我想只有通過文件看一次。

什麼是更有效的方式來實現我想要的?

+0

如果你只是用'find'獲取文件並刪除他們,如果他們不這樣做屬於他們應該在哪裏? '找到DAY2/-name「* dir2」-delete「 – fedorqui

+0

我無法刪除它們。之後我必須把它們放在正確的位置。事情是我想明白爲什麼,什麼時候發生,以及混合了多少個文件。 – dangom

+0

然後你可以用'man find'來嘗試打印你喜歡的任何東西。您可以選擇文件名等 – fedorqui

回答

2

如果我理解正確的話,那麼你就需要找到DAY1遞歸目錄下的文件有DAY2在他們的名字,同樣爲DAY2目錄什麼在他們的名字DAY1文件。

如果是這樣,對於DAY1目錄:

find DAY1/ -type f -name '*DAY2*' 

這將讓你有他們的名字DAY2DAY1目錄下的文件。同樣用於DAY2目錄:

find DAY2/ -type f -name '*DAY1*' 

兩者都是遞歸操作。


只獲取目錄名稱:

find DAY1/ -type f -name '*DAY2*' -exec dirname {} + 

注意,$PWD將顯示爲.

要獲得唯一性,輸出傳遞到sort -u

find DAY1/ -type f -name '*DAY2*' -exec dirname {} + | sort -u 
+0

文件太多。有沒有辦法找到只返回文件夾名稱,只有一次? – dangom

+0

@DanielG檢查我的編輯.. – heemayl

+0

這工作得很好。 Thx – dangom

1

鑑於通過他們去一次,並通過他們去兩次之間的差別僅僅是一個因子的兩差,切換到了一種方法,經過它們只有一次可能實際上而不是是一個勝利,因爲新方法可能很容易花費兩倍的文件。

所以你一定要試驗;這不一定是你可以自信地推理的東西。

不過,我會說,除了通過文件去兩次,ls版本還各種文件,其中可能有一個更比直線成本(除非是做某種類型的鬥之類的) 。通過編寫ls --sort=none而不是僅僅編寫ls可以減少算法的複雜性,並且幾乎肯定會給出明顯的改進。


但FWIW,這裏有一個版本,只有通過文件去一次,你可以嘗試:

for directory in */; do 
    find "$directory" -maxdepth 1 \(-name '*DAY1*' -or -name '*DAY2*' \) -print0 \ 
    | { saw_day1= 
     saw_day2= 
     while IFS= read -d '' subdirectory ; do 
     if [[ "$subdirectory" == *DAY1* ]] ; then 
      saw_day1=1 
     fi 
     if [[ "$subdirectory" == *DAY2* ]] ; then 
      saw_day2=1 
     fi 
     if [[ "$saw_day1" ]] && [[ "$saw_day2" ]] ; then 
      echo "mixed files in $directory" 
      break 
     fi 
     done 
    } 
done 
+0

這是目前正在返回'發現:路徑必須先於表達式:1' – dangom

+0

@DanielG:哎呀,我很抱歉;我寫了'-depth 1'而不是'-maxdepth 1'。將解決。 – ruakh

相關問題