Как создавать каталоги с тем же родительским именем

Как создать каталоги с тем же родительским именем?

В моей библиотеке у меня следующий макет:

DataFolder
   PATIENT A
          FOLDER1
          FOLDER2
          FOLDER# 
   PATIENT B
          FOLDER1
          FOLDER2
          FOLDER# 

В каждой из папок Я хочу создать подпапку с именем пациента , например xxPatient A и т. Д. затем в ЭТИХ папках я хочу создать еще две папки с именами «TypeX» и «Typez»

Как я могу это сделать? Это то, что у меня есть на данный момент ...


cd /mnt/d/DataFolder
for i in * 
do
cd ${i}

for j in FOLDER*
do 
cd ${j}

mkdir 


cd ../
done 

cd ../
done 

Это то, что я хочу в итоге:


DataFolder
   PATIENT A
      FOLDER1
        xxPATIENTA
          TypeX
          TypeZ
      FOLDER2
        xxPATIENTA
          TypeX
          TypeZ
   PATIENT B
      FOLDER1
        xxPATIENTB
          TypeX
          TypeZ
      FOLDER2
        xxPATIENTB
          TypeX
          TypeZ
      FOLDER# 
        xxPATIENTB
          TypeX
          TypeZ
1
задан 31 March 2021 в 00:47

2 ответа

while IFS=/ read -d '' -r a b c; do
    mkdir -p "$a/$b/$c/xx${b// /}"/Type{X,Y}
done < <(shopt -s failglob; printf %s\\0 DataFolder/*/*)
0
ответ дан 23 April 2021 в 23:28

Начиная с такой структуры ...

DataFolder
├── PATIENT A
│   ├── FOLDER1
│   └── FOLDER2
└── PATIENT B
    ├── FOLDER1
    ├── FOLDER2
    └── FOLDER3

Используйте следующий сценарий bash ...

SAVEIFS=$IFS; IFS=$(echo -en "\n\b");
for patient_name in `ls -1 DataFolder`; do
    echo "Processing ${patient_name}"
    for sub_folder_name in `ls -1 DataFolder/${patient_name}`; do
        echo "    Processing ${sub_folder_name}"
        mkdir -p "DataFolder/${patient_name}/${sub_folder_name}/xx${patient_name}/"{"TypeX","TypeY"}
    done
done
IFS=$SAVEIFS

... чтобы создать такую ​​структуру папок ...

DataFolder
├── PATIENT A
│   ├── FOLDER1
│   │   └── xxPATIENT A
│   │       ├── TypeX
│   │       └── TypeY
│   └── FOLDER2
│       └── xxPATIENT A
│           ├── TypeX
│           └── TypeY
└── PATIENT B
    ├── FOLDER1
    │   └── xxPATIENT B
    │       ├── TypeX
    │       └── TypeY
    ├── FOLDER2
    │   └── xxPATIENT B
    │       ├── TypeX
    │       └── TypeY
    └── FOLDER3
        └── xxPATIENT B
            ├── TypeX
            └── TypeY

Пояснение:

  • Есть два циклы в этом скрипте.
  • В первом цикле перечислены все существующие папки пациентов (ПАЦИЕНТ A, ПАЦИЕНТ B и т. Д.) В DataFolder.
  • Во втором цикле перечислены все существующие папки (FOLDER1, FOLDER2, FOLDER #) в каждой папке пациента.
  • Команда mkdir создает нужную структуру папок. Он использует флаг -p для создания всех родительских папок в предоставленном аргументе пути.
  • В конце аргумента пути к команде mkdir стоит {"TypeX", "TypeY"} . Это сообщает bash, что вы хотите создать две папки с именами «TypeX» и «TypeY» в одном месте.
  • Перед запуском сценария вы меняете IFS (внутренний разделитель полей) на только разрыв строки на новых строках, а не пробелы. Это важно, потому что у вас есть пробелы в именах файлов (например, «ПАЦИЕНТ A»), и вы хотите перебирать каждое имя файла, а не каждое слово в каждом имени файла.
  • Вы также сохраняете копию текущего IFS, чтобы можно было восстановить ее после завершения сценария.
2
ответ дан 23 April 2021 в 23:28

Другие вопросы по тегам:

Похожие вопросы: