У меня есть два дерева каталогов с одинаковыми макетами, т.е.
.
|-- dir1
| |-- a
| | |-- file1.txt
| | `-- file2.txt
| |-- b
| | `-- file3.txt
| `-- c
| `-- file4.txt
`-- dir2
|-- a
| |-- file5.txt
| `-- file6.txt
|-- b
| |-- file7.txt
| `-- file8.txt
`-- c
|-- file10.txt
`-- file9.txt
Я хотел бы объединить деревья каталогов dir1 и dir2 для создания:
merged/
|-- a
| |-- file1.txt
| |-- file2.txt
| |-- file5.txt
| `-- file6.txt
|-- b
| |-- file3.txt
| |-- file7.txt
| `-- file8.txt
`-- c
|-- file10.txt
|-- file4.txt
`-- file9.txt
Я знаю, что могу сделать это с помощью команды "cp", но я хочу переместить файлы вместо копирования, потому что реальные каталоги, которые я хочу объединить, действительно большие и содержат много файлов (миллионы). Если я использую «mv», я получаю ошибку «Файл существует» из-за конфликтующих имен каталогов.
ОБНОВЛЕНИЕ: Вы можете предположить, что между двумя деревьями каталогов нет повторяющихся файлов.
Ответы:
Это будет создавать жесткие ссылки, а не перемещать их, вы можете убедиться, что они были перемещены правильно, а затем удалить
dir1/
иdir2/
.источник
--link-dest
путь абсолютным или относительнымmerged/
; или это будет копировать.Странно, никто не заметил, что
cp
есть вариант-l
:Вы можете сделать что-то вроде
источник
cp -l
которая не работает в файловых системах.cp -a
(синонимcp -RPp
), чтобы сохранить все атрибуты файлов и избегать следующих символических ссылок: здесь команда становитсяcp -al dir1/* dir2/* merge
.Для этого вы можете использовать переименование (также известное как prename из пакета perl). Помните, что имя не обязательно относится к команде, которую я описываю за пределами debian / ubuntu (хотя это единственный переносимый файл perl, если вам это нужно).
У вас также есть возможность использовать vidir (из moreutils) и редактировать пути к файлам из предпочитаемого вами текстового редактора.
источник
Мне нравятся решения rsync и prename , но если вы действительно хотите, чтобы mv выполнял свою работу и
-print0
и-depth
,-0
,тогда можно обрабатывать большое количество файлов, в именах которых могут быть случайные пробелы, и все это с помощью сценария оболочки в стиле Борна:
источник
find . -name '*.torrent' | xargs -d '\n' rm
Грубая сила
bash
тест делает это
источник
Мне приходилось делать это несколько раз для деревьев исходного кода на разных этапах разработки. Моим решением было использовать Git следующим образом:
Вы можете уточнить это с помощью ветвления и так далее, но это общая идея. И у вас меньше страха перед тем, как его заполнить, потому что у вас есть полный снимок каждого состояния.
источник