Некоторое действие поиска и устранения неисправностей необходимо для нахождения категорического ответа:
Необходимо будет скопировать их в место назначения и затем удалить источник, с помощью команд cp -r * ..
сопровождаемый rm -rf *
.
Я не думаю, что можно "объединить" использование каталогов mv
.
rsync
вероятно, был бы более оптимальный вариант здесь. Это столь же просто как rsync -a subdir/ ./
.
Мое тестовое дерево в filename
:contents
формат:
./file1:root
./file2:root
./dir/file3:dir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir
Выполнение rsync
:
$ rsync -a -v subdir/ ./
sending incremental file list
./
file1
dir/
dir/file3
Дает:
./file1:subdir
./file2:root
./dir/file3:subdir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir
И затем, для эмуляции mv
, Вы, вероятно, хотите удалить исходный каталог:
$ rm -r subdir/
Предоставление:
./file1:subdir
./file2:parent
./dir/file3:subdir
./dir/file4:dir
Если это неправильно, можно ли обеспечить подобный пример (например, использование моего тестового дерева от близости верхняя часть этого ответа) с желаемым результатом?
rm -r
в конце для создания его в основном тем же как mv
.
– Mikel
23.03.2011, 00:53
mv
является атомарным, сохраняет inode числа (таким образом, файл может остаться открытым), и не занимает время и располагает создание с интервалами копии.
– Gilles 'SO- stop being evil'
23.03.2011, 01:08
cp -r; rm -r
. Я думаю в этом смысле, rsync
стоит упомянуть также.
– Mikel
23.03.2011, 01:21
Вот сценарий, который перемещает файлы из-под /path/to/source/root
к соответствующему пути под /path/to/destination/root
.
Остерегайтесь, непротестированный код.
export dest='/path/to/destination/root'
cd /path/to/source/root
find . -type d \( -exec sh -c '[ -d "$dest/$0" ]' \; -o \
-exec sh -c 'mv "$0" "$dest/$0"' {} \; -prune \) \
-o -exec sh -c '
if ! [ -e "$dest/$0" ]; then
mv -f "$0" "$dest/$0"
fi
' {} \;
\;
перед -o
на первой строке find
команда, и Вы не должны выходить !
в if
- это справедливо !
, нет \!
– llhuii
20.04.2011, 08:30
rsync
может удалить источник после копий с --remove-source-files
параметр. Это должно быть удобным способом сделать то, что Вы хотели бы.
От rsync man page
:
--remove-source-files sender removes synchronized files (non-dir)
cp -r; rm
из-за недостатка свободного места. Вместо этого rsync --remove-source-files
оба минимизированных используемых дисковых пространства постарались не копировать по тем же самым файлам.
– kqw
05.08.2014, 15:10
Вы можете сделать это с CP
и RM
, но, не копируя масштабное количество данных, которые вы (предположительно) пытаетесь избежать передачи. @mattdm ссылается на это в его комментариев , а и ответ на другой вопрос имеет более полное обсуждение различных вариантов.
cp -rlf source destination
rm -r source
По сути, параметр -L
для команды CP
создает жесткие ссылки на файлы, а не копирование их данных в новые файлы.
Если у вас достаточно места для хранения, вы можете сделать это следующим образом:
mv -bfv directory_1/* directory_2/ # all duplicate source files/directories
# will have ~ appended to them
find -name "*~" -delete # will recursively find and delete all files
# with ~ on the end
Убедитесь, что нет важных файлов с ~ на конце, но если они есть, вы можете добавить - суффикс = whateveryouwant
вместо значения по умолчанию.
Эта тема существует уже много лет и до сих пор занимает первое место в google, поэтому я хотел добавить еще один метод. Как я обычно это делаю: упаковываю содержимое подкаталога в tarball, перемещаю tarball в родительский каталог, а затем извлекаю его с помощью стандартного поведения --overwrite. Это делает именно то, что вы ищете. После этого вы можете удалить поддиректорию.
cd xyz
tar -cvzpf tmp.tar.gz *
mv tmp.tar.gz ../tmp.tar.gz
cd ..
tar -xvzpf tmp.tar.gz
rm -rf xyz
rm -f tmp.tar.gz
mv
быстрее, потому что Вы находитесь в той же файловой системе? Что, если Вы используетеcp -l
создать hardlinks вместо того, чтобы на самом деле переместить файлы? – mattdm 22.03.2011, 22:32cp -a
вместоcp -r
для сохранения атрибутов файла (метка времени, полномочия, и т.д.). – dotancohen 02.02.2014, 09:14cp -rl source destination && rm -r source
. – William Everett 31.05.2016, 20:43