переименовать папку, изменив порядок - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть несколько каталогов с именами, такими как:

"Some NameAndMorEyy_mm_dd"

, и я хочу переименовать их как:

"yy_mm_dd_Some NameAndMore"

Где, часть Some NameAndMore может содержать знаки ударения, пробелыи может заканчиваться пробелом или _ или обоими, и те должны быть удалены.

Некоторые примеры:

"Jhon Doe_18_08_02"
"Jhon Doe 18_08_03"
"Jhon Doe_ 18_08_04"
"Jhon Doe _18_07_02"
"Jhon Doé_18_10_02"
"Jhon Doñe_18_08_02"

Следует переименовать в:

"18_08_02_Jhon Doe"
"18_08_03_Jhon Doe"
"18_08_04_Jhon Doe"
"18_07_02_Jhon Doe"
"18_10_02_Jhon Doé"
"18_08_02_Jhon Doñe"

соответственно.

Теперь те, которые заканчиваются на и пробелами, и _ - это всего лишь несколько, так что вы можете игнорировать их, если хотите.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

И один ленивый лайнер :) ... уберите первый эхо, чтобы заставить его работать .

for i in *; do  [[ -d $i ]] && echo mv "$i" "$( echo $i| sed -r -e 's/^(.+)([0-9][0-9]_[0-9][0-9]_[0-9][0-9])$/\2_\1/' -e 's/[_ ]+$//' )" ; done
mv Jhon Doe _18_07_02 18_07_02_Jhon Doe
mv Jhon Doe_18_08_02 18_08_02_Jhon Doe
mv Jhon Doe 18_08_03 18_08_03_Jhon Doe
mv Jhon Doe_ 18_08_04 18_08_04_Jhon Doe
mv Jhon Doé_18_10_02 18_10_02_Jhon Doé
mv Jhon Doñe_18_08_02 18_08_02_Jhon Doñ
0 голосов
/ 16 ноября 2018

Это (за исключением mv) чистое решение Bash:

#! /bin/bash

shopt -s dotglob    # Globs match names beginning with '.'
shopt -s nullglob   # Globs expand to nothing when nothing matches

for namedate in *[0-9][0-9]_[0-9][0-9]_[0-9][0-9] ; do
    [[ -d $namedate ]] || continue  # Skip non-directories
    name=${namedate%??_??_??}       # Remove date from end to get name
    date=${namedate#"$name"}        # Remove name from start to get date
    name=${name%[ _]}               # Remove trailing space or _
    name=${name%[ _]}               # Remove possible 2nd trailing space or _
    datename=${date}_${name}

    if [[ -e $datename ]] ; then
        printf "Warning: '%s' already exists.  Skipping.\\n" "$datename" >&2
    else
        mv -- "$namedate" "$datename"
        printf "Moved '%s' to '%s'\\n" "$namedate" "$datename" >&2
    fi
done

Код Shellcheck -чистый. Чтобы избежать чего-то странного, он проверяет, что каталог назначения не существует, прежде чем выполнить mv.

0 голосов
/ 16 ноября 2018

Вот несколько медленное решение, но оно должно работать.Замените echo "move ..." фактической командой перемещения.Можно было бы ускорить использование меньшего числа подоболочек до sed.

Идея состоит в том, чтобы найти разбиение путем нахождения начала чисел.Это предполагает, что имена не имеют никаких чисел в них.Мы разбиваем на две части и удаляем любые _ или пробелы из имени, а затем объединяем вместе в движении.

Также используется find, чтобы файлы с пробелами могли быть правильно обработаны.

#!/bin/bash

find . -mindepth 1 -maxdepth 1 -type d | (while read -r d; do
  d=$(basename "$d")
  name_part=$(echo "$d" | sed -rn 's/(^[^0-9]+)(.*)$/\1/p')
  date_part=$(echo "$d" | sed -rn 's/(^[^0-9]+)(.*)$/\2/p')

  name_part=$(echo "$name_part" | sed -rn 's/([_ ]+)$//p')

  # change this line here
  # mv "$d" "${date_part}_${name_part}"
  echo "move $d ==> ${date_part}_${name_part}"
done)

Исходя из данных испытаний, вывод показывает:

move Jhon Doe_18_08_02 ==> 18_08_02_Jhon Doe
move Jhon Doe 18_08_03 ==> 18_08_03_Jhon Doe
move Jhon Doe_ 18_08_04 ==> 18_08_04_Jhon Doe
move Jhon Doñe_18_08_02 ==> 18_08_02_Jhon Doñe
move Jhon Doé_18_10_02 ==> 18_10_02_Jhon Doé
...