如何创建具有相同父名的目录?
在我的图书馆中,我有以下布局:
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/*/*)