2

Использование программы переименования сильно испортило некоторые из моих файлов. Я пытаюсь привести их в порядок.

У меня есть структура файла, как это:

./Hello World/some-filename.ext
./Kitty Parade/another.ext
./Third Example/abc.ext
./some-filename.ext2
./another.ext2
./abc.ext2

Цель - переместить файлы в текущей папке (./) обратно в их исходные папки.

Например:
another.ext2 принадлежит в ./Kitty Parade/ папка
some-filename.ext2 принадлежит в ./Hello World/ папка
abc.ex2 принадлежит в ./Third Example/ папка`

Правило можно описать так: если файл существует в текущей папке (./), найдите папку, содержащую файл с тем же именем файла (но с другим расширением), и переместите его в эту папку. Примечание: не существует достоверная связь между ./myFilename и ./originalFolderName этого файла.

Это случилось с более чем 4000 файлов, в противном случае я бы сделал это вручную. Любая возможная помощь?

1 ответ1

5

Попробуйте этот кусок магии оболочки:

for i in *.*; do
  BASE=$(basename "$i" .ext2)
  LIST=*/"${BASE}".*
  DIR=$(dirname "${LIST}")
  mv -n "$i" "${DIR}"
done

Или как вкладчик:

for i in *.*; do mv -n "$i" "$(dirname */"$(basename "$i" .ext2)".*)"; done

До:

whitequark@forth:~/test$ ls *
test 1.ext2  test 2.ext2  test 3.ext2

f 1:
test 1.ext

f 2:
test 2.ext  test 3.ext

После:

whitequark@forth:~/test$ ls *
f 1:
test 1.ext  test 1.ext2

f 2:
test 2.ext  test 2.ext2  test 3.ext  test 3.ext2

-n защитит вас от перезаписи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .