2016-07-28 43 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

相关问题