Добавить часть filepath в качестве префикса к имени файла для всех файлов в папке - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь переименовать файлы, основываясь на имени верхнего каталога, но у меня нет опыта работы с bash-скриптами.

Допустим, у меня есть каталог, который содержит тысячи каталогов с именем "k99_xxx_properties", и в каждом каталоге k99 есть каталог Alignments, а в каталоге Alignments есть файлы с именем sample1, sample2, sample3 in и так далее. Я хочу переименовать файлы примеров, добавив часть «k99_xxx» в верхнем каталоге в качестве префикса («k99_xxx_sample1»).

Я знаю, что все, что мне нужно сделать, это перебрать все каталоги k99_xxx_properties, сохранить часть имени каталога k99_xxx в качестве переменной и перейти к каждому k99_xxx, перейти к CD в Alignments и пройтись по каждому файлу в Alignments, чтобы добавить k99_xxx как префикс для имен файлов примеров.

Как бы я поступил в скрипте bash?

1 Ответ

0 голосов
/ 24 мая 2019

Этот Shellcheck -чистый код представляет собой простой перевод описания вопроса в Bash:

#! /bin/bash -p

shopt -s nullglob   # Globs that match nothing expand to nothing

# Loop through all k99_xxx_properties directories
for k99dir in k99_*_properties/ ; do
    # Save the k99_xxx portion of the directory name as a variable
    k999_xxx=${k99dir%_properties/}

    # (Skip the directory if it doesn't have an 'Alignments' subdirectory)
    [[ -d ${k99dir}Alignments ]] || continue

    # navigate into each k99_xxx, cd into Alignments
    (
        cd -- "${k99dir}Alignments" || exit

        # loop through every file in Alignments to add k99_xxx
        # as a prefix for the sample filenames.
        for sf in sample* ; do
            echo mv -- "$sf" "${k999_xxx}_${sf}"
            mv -- "$sf" "${k999_xxx}_${sf}"
        done
    )
done
  • shopt -s nullglob предотвращает попытку кода обработать поддельные каталоги 'k99 _ * _ properties' или файлы 'sample *', если он запускается там, где их нет.
  • См. Удаление части строки (BashFAQ / 100 (Как мне манипулировать строками в bash?)) для объяснения ${k99dir%_properties/}.
  • Скобки вокруг операторов, начинающихся с cd ..., заставляют их запускаться в подоболочке. Это означает, что cd (и возможный exit) не влияют на текущую оболочку. Преимущество состоит в том, что нет необходимости cd возвращаться в начальный каталог для следующей итерации внешнего цикла. Не всегда cd можно вернуться в каталог после использования cd, чтобы оставить его.
  • Условное exit после cd (которое выходит только из окружающих (создающих подоболочку) скобок) должно предотвращать попытки перемещения файлов в неправильный каталог, если cd завершится неудачно. Shellcheck жалуется, если exit отсутствует (что является одной из причин, по которым всегда стоит использовать Shellcheck в коде оболочки).
  • Поскольку он выполняется в каталоге, отличном от текущего, вывод echo mv ... может привести к путанице. (Это одна из причин, по которой лучше избегать использования cd в программах. Как правило, лучше всего выполнять операции из текущего каталога.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...