Я рекомендовал бы использовать rsync от родителя:
rsync -avPr -b --suffix='-original' child/* .
который скопирует все существующие дубликаты файлов в родителе к исходному файлом.
В этом примере переместит файлы от '/parent/old-dir' к '/parent':
cd /parent
rsync -av --progress old-dir/ .
rm -rf old-dir
По правилам rsync это заменит, копирует с более новыми файлами от old-dir
.
cp -bal . ..
Это скопирует все в текущем каталоге к каталогу выше его, сохраняя все полномочия, с помощью hardlinks для уменьшения IO, если это возможно, и на дубликатах он создает имя файла ~
после этого
rm -rf . ; cd .. ; rmdir <originaldir>;
Можно попробовать
find . -maxdepth 1 -print0 | xargs -I '{}' -r0 mv '{}' ..
который перезапишет файлы простофили в..
Можно использовать mv-u '{}', чтобы не перезаписать если простофиля в.. то же или более новый
..
к mv '{}' +
управляйте, как + просто добавляет в конец.
–
17.12.2010, 18:31
-exec mv -t .. -- {} +
. Портативно: -exec sh -c 'mv -- "$@"' _ {} +
.
– Gilles 'SO- stop being evil'
17.12.2010, 22:04
mv -i
только подсказки, если место назначения существует.
yes n | mv -i …
перемещения все файлы, которые не существуют в целевом каталоге. На FreeBSD и OSX, можно сократить это к mv -n …
.
Обратите внимание, что ни один из них не объединит спор каталога с существующим каталогом на то же имя в целевом каталоге.
Отдельный вопрос - то, как действовать на все файлы в текущем каталоге. Существует две проблемы: захват всех файлов (*
опускает точечные файлы), и не столкновение с командной строкой. На Linux (или в более общем плане с GNU находят и GNU coreutils):
find . -mindepth 1 -maxdepth 1 -exec mv -i -t .. -- {} +
С GNU находят, но не GNU coreutils (или более старый GNU coreutils):
find . -mindepth 1 -maxdepth 1 -exec sh -c 'mv -i -- "$@" "$0"' .. {} +
Портативно:
find . -name . -o -exec sh -c 'mv -i -- "$@" "$0"' .. {} -type d -prune
Поскольку обычный zsh делает вещи легче. Это не имеет ограничения длины командной строки внутренне, поэтому при использовании mv
встроенный Вы не должны волноваться об этом. И можно сказать этому не игнорировать точечные файлы с D
спецификатор шарика. Ограничение: это не работает через файловые системы (с zsh 4.3.10).
zmodload zsh/files
mv -i -- *(D) ..
Я сказал относительно нашего ML
mv * ..
очевидно, это не очень безопасно..., это перезапишет вещи. Это могло бы иметь пределы, с которыми я никогда не сталкивался.
-
. Это не поймает файлы, имя которых начинается .
.
– Gilles 'SO- stop being evil'
17.12.2010, 22:06
Следующее является шаблоном Python, который я использовал успешно в прошлом.
#!/usr/bin/env python
#
# Bart Kastermans, www.bartk.nl
#
# rename of collection of files in a directory
import os
import shutil
# only work on files whose name starts with a D
files = [filename for filename in os.listdir ("/Users/kasterma/Music/Audio Hijack/") if filename[0] =="D"]
for filename in files:
shutil.move (filename, filename [:23] + ".mp3")
-a
подразумевает-r
– xenoterracide 17.12.2010, 19:26-l
дляcp
) – xenoterracide 18.12.2010, 14:13-H
или--hard-links
флаги для rsync для сохранения жестких ссылок. – Tok 20.12.2010, 16:14--link-dest=DIR
флаг для достижения этого поведения как:rsync -avP --link-dest=/path/to/src /path/to/src/* /path/to/dest/
который трудно свяжет в dst/любые неизменные файлы между src и src, в этом случае все файлы. Обычно Вы видите этот флаг, используемый, когда Вы хотите повторно связать файлы резервных копий, не копируя их данные такой как--link-dest=/most/recent/backup
. – Tok 20.12.2010, 16:46