如何创建具有相同父名称的目录

如何创建具有相同父名称的目录

如何创建具有相同父名的目录?

在我的图书馆中,我有以下布局:

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

从这样的结构开始...

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

解释:

  • 该脚本中有两个循环。
  • 第一个循环列出了 DataFolder 中所有现有的患者文件夹(患者 A、患者 B 等)。
  • 第二个循环列出每个患者文件夹内的所有现有文件夹 (FOLDER1、FOLDER2、FOLDER#)。
  • mkdir命令会创建所需的文件夹结构。它使用标志-p来创建全部提供的路径参数中的父文件夹。
  • 命令的路径参数末尾mkdir{"TypeX","TypeY"}。这告诉 bash 您要在同一位置创建两个文件夹,分别名为“TypeX”和“TypeY”。
  • 在启动脚本之前,将 IFS(内部字段分隔符)更改为仅有的在新行上换行,而不是在空格上换行。这很重要,因为您的文件名中有空格(例如“PATIENT A”),并且您想循环遍历每个文件名,而不是每个文件名中的每个单词。
  • 您还保存了当前 IFS 的副本,以便在脚本完成后可以恢复它。

答案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/*/*)

相关内容