2016-04-04 2 views
2

В моем текущем каталоге есть много файлов. Некоторые файлы имеют часть имени файла.Поиск файлов, которые разделяют часть имени файла

.: например

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. Я googled, но не мог найти сайты, которые описывали процесс, который мне нужен. До сих пор в псевдо-коде у меня есть:

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

Любая информация, чтобы помочь мне двигаться в правильном направлении будут оценены.

+1

Вы не говорите, как совпадение имен файлов. Не могли бы вы добавить это? –

ответ

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 
+0

Но есть много «обычных бит», поэтому мне пришлось бы делать это несколько раз вручную. Я добавил к моему вопросу сейчас, чтобы сделать его немного яснее. – user1551817

+1

Я ответил до вашего редактирования. Будет ли переосмысление –

+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 

вы можете передать результаты в команде ср

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

добавляет суффикс DUP дублировать имена файлов или

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

перемещается anotherlocation.

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 
Смежные вопросы