Я пытаюсь взять каталог, заполненный неизвестным количеством файлов, и поместить каждый файл в подкаталог на основе имени файла. В имени файла может быть несколько подкаталогов, разделенных символом подчеркивания, поэтому он должен иметь возможность рекурсивного извлечения имен подкаталогов.
Примеры файлов:
2020_Documents_Bills_Water Bill.pdf
2020_Documents_Taxes_W2.pdf
2020_Documents_Receipts_Store Name_Groceries.pdf
2020_Pictures_Family Trip_California_Disney Land_Family Pic.jpg
Таким образом, файл 2020_Documents_Bills_Water Bill.pdf
будет иметь вид 2020/Documents/Bills/Water Bill.pdf
.
Я хотел бы ограничить используемые инструменты bash, sed, grep, mkdir и mv, если это возможно.
У меня были некоторые мысли о том, как, по моему мнению, должен выполняться скрипт, но я не знаю, как заставить его рекурсивно получать подкаталоги без большого количества отвратительных if операторов. Я думал, что этот код, вероятно, мог бы получить первый subdir и поместить его в массив, а затем удалить этот текст и подчеркивание, которое следует за ним из имени файла, и затем повторять итерацию до тех пор, пока не заканчиваются подчеркивания.
#!/bin/bash
# cd to directory where files are located
cd /directory/with/files
# iterate over files in directory
for file in *; do
subDirs=() # empty array for subdirs
filePath="" # empty string to build filepath
# ------------------------------------------------------------
# code to extract subdir names and add to subDirs array
# ------------------------------------------------------------
# build filepath using string of all subdirs
for i in ${!subDirs[@]}; do
filepath="${filePath}/${subDirs[$i]}"
done
# set filename to text after last underscore
filename=${file##*_}
# make filepath based on subdirs
mkdir -p "${filepath}"
# move file into filepath without subdirs in name
mv ${file} "${filepath}/${filename}"
done