Изменить структуру папок и сделать файлы доступными с помощью ссылок - PullRequest
0 голосов
/ 06 марта 2020

(см. Также минимальный пример внизу)


У меня следующая структура папок:

https://drive.google.com/open?id=1an6x1IRtNjOG6d9D5FlYwsUxmgaEegUY

Каждая папка показывает в конце: дату, месяц и день:

например,

 /HRIT/EPI/2004/01/14

Внутри каждого дня каждая из этих подпапок содержит много файлов (всего около 10 ТБ).

Все доступные папки:

/HRIT/EPI/YYYY/MM/DD/

/HRIT/HRV/YYYY/MM/DD/

/HRIT/VIS006/YYYY/MM/DD/

/HRIT/VIS008/YYYY/MM/DD/

/HRIT/WV_062/YYYY/MM/DD/

/HRIT/WV_073/YYYY/MM/DD/

/HRIT/IR_016/YYYY/MM/DD/

/HRIT/IR_039/YYYY/MM/DD/

/HRIT/IR_087/YYYY/MM/DD/

/HRIT/IR_097/YYYY/MM/DD/

/HRIT/IR_108/YYYY/MM/DD/

/HRIT/IR_120/YYYY/MM/DD/

/HRIT/IR_134/YYYY/MM/DD/

/HRIT/PRO/YYYY/MM/DD/

Я хотел бы изменить структуру папок на:

/HRIT/YYYY/MM/DD/

Все файлы с EPI, HRV, VIS006, VIS008, WV_062, WV_073, IR_016, IR_039, IR_087, IR_097, IR_108, IR_124, IR_134, PRO не должен копироваться физически, но должен быть доступен по ссылкам в моей домашней папке / home

-> /home/HRIT/YYYY/MM/DD/

Возможно ли что-то подобное и как?


Вот минимальный пример того, что у меня в принципе есть и что я получу sh как результат:

у меня есть:

/HRIT/EPI/2019/01/01/epi_1.txt

/HRIT/EPI/2019/01/01/epi_2.txt

/HRIT/HRV/2019/01/01/hrv_1.txt

/HRIT/HRV/2019/01/01/hrv_2.txt

/HRIT/VIS006/2019/01/01/vis006_1.txt

/HRIT/VIS006/2019/01/01/vis006_2.txt

как результат я получу sh:

/home/HRIT/2019/01/01/epi_1.txt

/home/HRIT/2019/01/01/epi_2.txt

/home/HRIT/2019/01/01/hrv_1.txt

/home/HRIT/2019/01/01/hrv_2.txt

/home/HRIT/2019/01/01/vis006_1.txt

/home/HRIT/2019/01/01/vis006_2.txt

Как уже упоминалось выше, файлы не должны быть скопированы в эту новую папку r структура, но вместо этого сделана доступной по ссылкам (потому что на самом деле у меня слишком много файлов и недостаточно места для их копирования).

!!! Это чрезвычайно упрощено, так как у меня разные годы, месяцы и дни (см. Ссылку выше).

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Простейшее чтение l oop:

generate_list_of_files_for_example_with_find |
while IFS= read -r line; do
    IFS='/' read -r _ hrit _ rest <<<"$line"
    echo mkdir -p /home/"$hrit"/"$(dirname "$rest")"
    echo ln -s /home/"$hrit/$rest" "$line"
done

Удалите echo s, чтобы действительно создать ссылки и каталоги.

0 голосов
/ 12 марта 2020

Вот небольшой скрипт для этого. Я сделал по умолчанию только echo, вам нужно запустить его с --real, чтобы заставить его выполнять связывание

Это предполагает, что вы запускаете скрипт из директории /HRIT/, и Предполагается, что дата, а затем имя файла являются последней частью иерархии. Если ниже есть другие каталоги, это может не сработать.

DRYRUN=true
LINK="ln -s" # You can make this "ln" if you prefer hardlinks

if [[ $1 == '--real' ]]; then
  DRYRUN=false
fi

for file in $(find "$PWD" -type f); do
   dest=$( \
            echo "$file" | awk -F/ '{ year = NF-3; mon=NF-2; day=NF-1; print "/home/HRIT/"$year"/"$mon"/"$day"/"$NF }' \
   )
   if [[ -f "$dest" ]]; then
     echo "Skipping '$file' as destination link already exists at '$dest'"
   else
     if $DRYRUN; then
         echo $LINK "$file" "$dest"
     else
         $LINK "$file" "$dest"
     fi
   fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...