Как Вы увеличиваете объем файлов перемещения один каталог безопасно?

Для действительно сумасшедшей схемы эволюции UNIX посмотрите здесь. Не то, чтобы это очень полезно, хотя :).

10
10.12.2012, 02:21
7 ответов

Я рекомендовал бы использовать rsync от родителя:

rsync -avPr -b --suffix='-original' child/* .

который скопирует все существующие дубликаты файлов в родителе к исходному файлом.

6
27.01.2020, 20:01
  • 1
    я думаю -a подразумевает -r –  xenoterracide 17.12.2010, 19:26
  • 2
    @xenoterracide - Исправьте Вас 'r' –  Tok 17.12.2010, 19:42
  • 3
    @Tok - это возможный сделать копию как hardlinks? чтобы не потратить впустую IO. (как -l для cp) –  xenoterracide 18.12.2010, 14:13
  • 4
    @xenoterracide - Можно использовать -H или --hard-links флаги для rsync для сохранения жестких ссылок. –  Tok 20.12.2010, 16:14
  • 5
    @xenoterracide - Можно использовать --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

В этом примере переместит файлы от '/parent/old-dir' к '/parent':

cd /parent

rsync -av --progress old-dir/ .

rm -rf old-dir

По правилам rsync это заменит, копирует с более новыми файлами от old-dir.

2
27.01.2020, 20:01
cp -bal . ..

Это скопирует все в текущем каталоге к каталогу выше его, сохраняя все полномочия, с помощью hardlinks для уменьшения IO, если это возможно, и на дубликатах он создает имя файла ~

после этого

rm -rf . ; cd .. ; rmdir <originaldir>;
4
27.01.2020, 20:01
  • 1
    , вероятно, сталкивается с большим количеством проблемы файлов..., но не IO интенсивный как rsync. –  xenoterracide 18.12.2010, 14:13

Можно попробовать

find . -maxdepth 1 -print0 | xargs -I '{}' -r0 mv '{}' ..

который перезапишет файлы простофили в..

Можно использовать mv-u '{}', чтобы не перезаписать если простофиля в.. то же или более новый

1
27.01.2020, 20:01
  • 1
    , почему канал находит к xargs? почему бы не использовать + –  xenoterracide 17.12.2010, 18:15
  • 2
    @xenoterracide - Привычка и мобильность (это - расширение GNU). К тому же я только что попробовал его и не могу выяснить, как передать второй параметр .. к mv '{}' + управляйте, как + просто добавляет в конец. –   17.12.2010, 18:31
  • 3
    @Iain + находится в POSIX, мне на самом деле сказали ранее, что находка GNU была поздней для получения его. –  xenoterracide 17.12.2010, 18:46
  • 4
    Вы правы, но я все еще не могу изобразить способ использовать.. –   17.12.2010, 19:04
  • 5
    @xenoterracide: С GNU coreutils: -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) ..
1
27.01.2020, 20:01

Я сказал относительно нашего ML

mv * ..

очевидно, это не очень безопасно..., это перезапишет вещи. Это могло бы иметь пределы, с которыми я никогда не сталкивался.

0
27.01.2020, 20:01
  • 1
    Если у Вас будет большое количество файлов, то Вы, вероятно, получите 'список аргументов слишком длинная ошибка'. –   17.12.2010, 18:08
  • 2
    Это может сделать плохие вещи, если у Вас есть имя файла, которое начинается -. Это не поймает файлы, имя которых начинается .. –  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")
0
27.01.2020, 20:01

Теги

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