LINUX.ORG.RU

Заменить файлы в подкаталогах на файлы в каталоге

 


0

1

Имеется дерево каталогов, условно такое:

a/
  1/
    x.foo
  2/
    y.bar
  3/
    z.baz

и каталог с более новыми одноимёнными файлами, сваленными в кучу:

b/
  x.foo
  y.bar
  z.baz

Что требуется: брать файлы из b/ и заменять ими одноимённые в подкаталогах a/

Имена каталогов и файлов могут быть самые разные.

Надеюсь, понятно описал. В тегах поставил баш, но вообще без разницы, чем это сделать, был бы результат.

★★★
Ответ на: комментарий от teod0r

Не реагирует, молча завершается, но ничего не происходит. Может, в каких-то местах добавить verbosity, чтобы оно хоть что-то говорило?
Кстати, странные символы в именах файлов не могут мешать? Там поломанная китайщина, изначально файлы были с иероглифическими именами, но мне их прислали уже покорёженными, вида «┐ь╦┘╣║┬Є».
И ещё момент: файлы могут быть не на один уровень вниз, а в двух-трёх вложенных вглубь каталогах. Как тут?

P. S. Я пробовал решить проблему перлом (единственное, с чем я хоть как-то знаком) через File::Find, оно нормально находит файлы в одном каталоге, но утверждает, что в другом их нет, хотя они точно есть и точно одноимённые. Пробовал в обе стороны: и искать старые/вложенные и к ним соответствия в сваленных_в_кучу, и наоборот. Замечательно выдаёт список, но в других каталогах этих же имён не находит. Может, там перекодировка какая-то нужна, чтобы вся эта китайская грамота не мешала?

massimus ★★★
() автор топика
Ответ на: комментарий от massimus

Там поломанная китайщина

что-то типа

find . -mindepth 2 -type f -exec mv -t . {} +
пробовал?

emulek
()
Ответ на: комментарий от massimus

Может, там перекодировка какая-то нужна

перловка по дефолту НЕ работает с utf-8. Там какой-то ключ нужен. Т.е. одна буква «Ф» воспринимается как ДВА символа. А китайщина — как 3 или 4.

emulek
()
cd /path/to/b
# get source file from directory b/
for SRC in *; do
  echo "=== start $SRC"
  # if will be found > 1 files
  for DST in `find /path/to/a -type f -name "$SRC"`; do
       echo "      Moving $SRC to $DST"
       # to preserve permissions use cat
       cat "$SRC" > "$DST"
  done
  echo "end $SRC ==="
  echo ""
done
sdio ★★★★★
()
Ответ на: комментарий от sdio

Спасибо, брат!

Сначала не обратил внимания на cd /path/to/b в начале и удивлялся, почему оно не жрёт относительный от скрипта /path/to/a потом :) После скармливания абсолютного путяти всё засвистело в лучшем виде, не взирая на кодировки имён и вложенность.

За комментарии и эхо отдельное спасибо, просветляет.

massimus ★★★
() автор топика
Ответ на: комментарий от sdio

Хорошо, но зачем брать параметры echo в кавычки, ели они не содержат спецсимволов?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.