Обмен именами файлов и каталогов
У меня есть коллекция файлов на ./date-and-time/fixed/path/filename
где date-and-time
а также filename
являются переменными. Я хотел бы переместить все эти файлы в ./filename/date-and-time
, Первый путь - это имя файла, а первый путь - это путь. Есть ли хороший способ сделать это? Всего ~1000 файлов с ~ 100 разными именами файлов.
3 ответа
Как-то так должно работать (обратите внимание, у меня есть 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
Редактировать:
Если вам нужно создать больше папок, я рекомендую сделать скрипт примерно так:
Перед тем, как начать, я настоятельно рекомендую сделать резервную копию папки, в которой вы пытаетесь это сделать.
Перейдите в папку, над которой вы пытаетесь работать, а затем:
for file in *; do
if [[ -f "$file" ]]; then
mkdir "${file%.*}"
mv "$file" "${file%.*}"
fi
done
- Зацикливать все (*) файлы в текущей папке.
- создать папку (mkdir) из файла без его расширения ${file%.*}
- переместите (mv) файл в эту папку.