Как перезаписать конечные файлы с mv?

Некоторое действие поиска и устранения неисправностей необходимо для нахождения категорического ответа:

  • проверьте, что перенаправление портов включено в ssh конфигурации пользователя,
  • включите многословие ssh (-v),
  • проверьте вход в систему ssh локальный хост и защитите вход в систему удаленный,
  • протестируйте другой удаленный порт,
  • проверьте свои iptables настройки (как Shadur заявил).
163
22.03.2011, 23:56
7 ответов

Необходимо будет скопировать их в место назначения и затем удалить источник, с помощью команд cp -r * .. сопровождаемый rm -rf *.

Я не думаю, что можно "объединить" использование каталогов mv.

123
27.01.2020, 19:28
  • 1
    ну, это - то, что я не хотел делать, потому что будет требоваться много времени... Спасибо так или иначе. –  EricSchaefer 22.03.2011, 19:45
  • 2
    По-видимому, mv быстрее, потому что Вы находитесь в той же файловой системе? Что, если Вы используете cp -l создать hardlinks вместо того, чтобы на самом деле переместить файлы? –  mattdm 22.03.2011, 22:32
  • 3
    Необходимо использовать cp -a вместо cp -r для сохранения атрибутов файла (метка времени, полномочия, и т.д.). –  dotancohen 02.02.2014, 09:14
  • 4
    Для людей, прибывающих здесь поздно через Google, ответ ниже @palswim эмулирует поведение mv путем создания новых жестких ссылок на данные и затем удаления старых ссылок. Короткий ответ cp -rl source destination && rm -r source. –  William Everett 31.05.2016, 20:43

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

Если это неправильно, можно ли обеспечить подобный пример (например, использование моего тестового дерева от близости верхняя часть этого ответа) с желаемым результатом?

75
27.01.2020, 19:28
  • 1
    rsync. Этот вопрос о перемещении. Солярис –  Gilles 'SO- stop being evil' 23.03.2011, 00:51
  • 2
    @Gilles:Спасибо. я добавил rm -r в конце для создания его в основном тем же как mv. –  Mikel 23.03.2011, 00:53
  • 3
    copy-then-delete не эквивалентен mv, когда источник и место назначения находятся в той же файловой системе. mv является атомарным, сохраняет inode числа (таким образом, файл может остаться открытым), и не занимает время и располагает создание с интервалами копии. –  Gilles 'SO- stop being evil' 23.03.2011, 01:08
  • 4
    @Gilles: Я понимаю это, но в настоящее время ведущий ответ cp -r; rm -r. Я думаю в этом смысле, rsync стоит упомянуть также. –  Mikel 23.03.2011, 01:21
  • 5
    я уже сделал это с CP/комнатой (это было срочно). Действительно требовалось много времени. Сценарий Gilles, вероятно, был бы намного более быстрым, но он слишком опаздывал также. –  EricSchaefer 23.03.2011, 12:09

Вот сценарий, который перемещает файлы из-под /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
' {} \;
9
27.01.2020, 19:28
  • 1
    Два исправления: Вам нужен a \; перед -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)
50
27.01.2020, 19:28
  • 1
    Это - действительно лучший ответ. Я не мог использовать 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 создает жесткие ссылки на файлы, а не копирование их данных в новые файлы.

22
27.01.2020, 19:28

Если у вас достаточно места для хранения, вы можете сделать это следующим образом:

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 вместо значения по умолчанию.

0
27.01.2020, 19:28

Эта тема существует уже много лет и до сих пор занимает первое место в 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
3
27.01.2020, 19:28

Теги

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