Свопинг имен файлов и имен каталогов

У меня есть набор файлов в ./date-and-time/fixed/path/filename где date-and-time и filename являются переменными. Я хотел бы переместить все эти файлы в ./filename/date-and-time. Бывший путь является именем файла, и бывшее имя файла является путем. Существует ли хороший способ сделать это? Существует ~1000 файлов всего с ~100 отличными именами файлов.

2
задан 28 February 2018 в 06:54

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
4
ответ дан 2 December 2019 в 01:42

Я предположу, что шаблон для пути всегда ./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;
2
ответ дан 2 December 2019 в 01:42

Как это:

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
  1. Цикл по всем (*) файлы в текущей папке.
  2. создайте папку (mkdir) из файла без его дополнительного $ {% файла.*}
  3. переместите (mv) файл в ту папку.
0
ответ дан 2 December 2019 в 01:42

Другие вопросы по тегам:

Похожие вопросы: