Обмен именами файлов и каталогов

У меня есть коллекция файлов на ./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
  1. Зацикливать все (*) файлы в текущей папке.
  2. создать папку (mkdir) из файла без его расширения ${file%.*}
  3. переместите (mv) файл в эту папку.
Другие вопросы по тегам