У меня есть набор файлов в ./date-and-time/fixed/path/filename
где date-and-time
и filename
являются переменными. Я хотел бы переместить все эти файлы в ./filename/date-and-time
. Бывший путь является именем файла, и бывшее имя файла является путем. Существует ли хороший способ сделать это? Существует ~1000 файлов всего с ~100 отличными именами файлов.
Что-то вроде этого должно работать (обратите внимание, что я имею echo
редактор фактические команды; проверьте тщательно, что это делает правильную вещь прежде, чем удалить их),
#!/bin/bash
shopt -s nullglob
for file in */fixed/path/*; do
[[ -f "$file" ]] || continue
f="${file##*/}"; d="${file%%/*}"
echo mkdir -p "$f" && echo mv --no-clobber -- "$file" "$f/$d"
done
Я предположу, что шаблон для пути всегда ./date-and-time/fixed/path/filename
с переменной date-and-time
и filename
.
date-and-time
может быть извлечен через awk
:
$ echo './date-and-time/fixed/path/filename' |awk -F "/" '{print $2}'
date-and-time
filename
немного легче добраться, поскольку это может быть извлечено basename
:
$ basename ./date-and-time/fixed/path/filename
filename
Из этих двух сегментов кода непротестированный сценарий следует для перемещения файлов в способе, которым Вы описываете при казни в .
. Проверьте его перед использованием.
#!/bin/bash
for i in ./*/fixed/path/*; do
date_and_time=$(echo "$i" |awk -F "/" '{print $2}');
filename=$(basename "$i");
mkdir "$filename";
mv "$i" "$filename"/"$date_and_time";
done;
Как это:
mkdir ./filename/ && mv ./date-and-time/path/to/path-to-your-folder/* ./filename/date-and-time
Если необходимо создать больше папок, я рекомендую делать сценарий чем-то вроде этого:
Перед запуском я действительно рекомендую сделать резервное копирование папки, на которой Вы пытаетесь сделать это.
CD в папку Вы пытающийся воздействовать на и затем:
for file in *; do
if [[ -f "$file" ]]; then
mkdir "${file%.*}"
mv "$file" "${file%.*}"
fi
done