переименовать все файлы в одном каталоге на основе подходящей подстроки из файлов в другом каталоге - PullRequest
0 голосов
/ 02 июля 2019

Я хотел бы переименовать все файлы в одном каталоге на основе совпадения подстроки текущего имени файла с полным именем файла в другом каталоге. Например, у меня есть две директории с 1200 файлами, аналогичные следующему примеру, где я хочу, чтобы вторая папка файлов была переименована в полное имя файла на основе уникального совпадающего ID / подстроки:

Directory 1:
ABC_MA123.bed
EFG_MA124.bed
XYZ_MA125.bed

Directory 2:
MA123.bed
MA124.bed
MA125.bed

Желаемый результат:

Directory 2:
ABC_MA123.bed
EFG_MA124.bed
XYZ_MA125.bed

Есть ли простой способ сделать это с помощью скрипта bash / awk?

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Предполагая, что имена файлов в dir2 являются подстроками имен файлов в dir1, простая подстановка должна работать:

d1="/full/path/to/dir1"
d2="/full/path/to/dir2"

cd "$d2"
for f2 in *; do
    f1=("$d1"/*"$f2"*)
    if [[ ${#f1[@]} != 1 ]]; then
        printf "ERROR: multiple matches: %s\n" "$f2" 1>&2
    elif [[ ! -f $f1 ]]; then
        printf "ERROR: no match: %s\n" "$f2" 1>&2
    else
        new="${f1##*/}" # strip to bare filename
        if [[ $f2 == $new ]]; then
            printf "WARNING: no change: %s\n" "$f2" 1>&2
        elif [[ -f $new ]]; then
            printf "ERROR: exists: %s\n" "$new" 1>&2
        else
            mv "$f2" "${f1##*/}"
        fi
    fi
done
0 голосов
/ 02 июля 2019

Вы уверены, что каждый файл в каталоге 2 имеет ровно одно совпадение в каталоге 1?

Вы могли бы сделать что-то вроде этого, предполагая, что каталогами являются / tmp / 1 и / tmp / 2:

(cd /tmp/2; ls -1) | 
(cd /tmp/1; while read f2; do f1=(/tmp/1/*$f2); echo mv $f2 ${f1##*/}; done) 

Для каждого файла в каталоге 2 найдите файл в каталоге 1 с тем же суффиксом, затем переименуйте файл в каталоге 2 на имя соответствующего файла в каталоге 1. ${f1##*/} удаляет путь из f1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...