查找共享文件名的一部分的文件

时间:2016-04-04 14:32:25

标签: bash match

在我当前的目录中有很多文件。一些文件共享其文件名的一部分。

e.g:

XGAE_537493_GSR.FITS
TGFE_537493_RRF.FITS
EGRE_537497_HDR.FITS
TRTE_537497_YUH.FITS
TRXX_537499_YDF.FITS    
.
.

档案1& 2将是匹配,文件3& 4.文件5不匹配。因此,文件1,2,3和4将被移动。

我想移动共享文件名部分文件的文件,以便将它们与那些没有文件名的文件分开。

我试图用bash来做这件事。我用谷歌搜索,但无法找到那些完全描述我需要的过程的网站。到目前为止我在伪代码中有:

FOR F IN *
IF ${FILE:5:10} MATCHES ANY OTHER ${FILE:5:10}
MOVE ALL MATCHES TO ANOTHER DIRECTORY

任何有助于我朝着正确方向前进的信息都将受到赞赏。

3 个答案:

答案 0 :(得分:1)

试试这个:

for f in ./*.FITS ; do
    middleBit=$(echo $f| cut -d'_' -f 1)
    count=$(ls *middleBit*.FITS | wc -l)
    if [ $count -ge 1 ]
    then
       for match in *middleBit*.FITS ; do
           mv $match ./somewhere
       done
    fi
done

答案 1 :(得分:1)

如果您的文件结构已修复,您可以扫描它们并在awk中找到文件名的子字段中的重复项。

例如

$ ls -1 | awk -F_ 'NF==3{f[$2]=(a[$2]++?f[$2] OFS $0:$0)}
                     END{for(k in f) if(a[k]>1) print f[k]} '

TGFE_537493_RRF.FITS
XGAE_537493_GSR.FITS

然后,您可以将结果传递给cp命令

$ ... | xargs -I file cp file file.DUP

将后缀DUP添加到重复的文件名,或

$ ... | xargs -I file mv file anotherlocation/

转移到另一个位置。

答案 2 :(得分:1)

在BASH 4中使用关联数组,您可以轻松完成:

#!/bin/bash

declare -A arr

for f in *.FITS; do
    k="${f:5:6}"
    [[ ${arr[$k]} ]] && mv "$f" /dest/ || arr["$k"]=1
done