Эксцентричная мв операция

342
macek

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

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

./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 файлов, в противном случае я бы сделал это вручную. Любая возможная помощь?

2

1 ответ на вопрос

5
whitequark

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

for i in *.*; do BASE=$(basename "$i" .ext2) LIST=*/"$".* DIR=$(dirname "$") mv -n "$i" "$" 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Выключатель защитит вас от перезаписи ничего.

ls `* /" $ ". *` heh, nice Всегда использовал find для этого. skarface 14 лет назад 0
`ls` не обязателен:` LIST = * / "$ ". * `и` "$ (dirname" * / "$ (базовое имя" $ i ".ext2)". * ")" Dennis Williamson 14 лет назад 0
@ Денис: спасибо, изменился. что осталось от предыдущей версии команды. whitequark 14 лет назад 0

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