在我当前的目录中有很多文件。一些文件共享其文件名的一部分。
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
任何有助于我朝着正确方向前进的信息都将受到赞赏。
答案 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