web-dev-qa-db-ja.com

ファイルを1つのディレクトリに安全に一括移動するにはどうすればよいですか?

ディレクトリに数百または数千のファイルが存在する可能性があり、..に重複があるかどうかわからない可能性があるディレクトリにファイルを移動するにはどうすればよいですか。どの方法を使用しますか?

重複の処理方法はさまざまです。上書きすることもあれば、より安全にする必要があることもあります。 IOこれらは本番サーバーであるため、重要な場合があります。ただし、指定された数量では、重複していないファイルを要求するオプションはありません。権限やタイムスタンプなどの保持は重要です。通常、データが何であるかを知っています。

ああ、それはmvを使用する必要はありません、rsynccpソリューションは大歓迎です。

注:CentOS 5.5を実行しているので、最近の機能であるために機能しない場合はお知らせください

10
xenoterracide

親からrsyncを使用することをお勧めします:

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

これは、親にある既存の重複ファイルをすべてfile-originalにバックアップします。

6
Tok
cp -bal . ..

これにより、現在のディレクトリ内のすべてがその上のディレクトリにコピーされ、すべてのアクセス許可が保持され、ハードリンクを使用してIO可能であれば最小化され、重複するとファイル名が作成されます〜

その後

rm -rf . ; cd .. ; rmdir <originaldir>;
4
xenoterracide

この例では、ファイルを「/ parent/old-dir」から「/ parent」に移動します。

cd /parent

rsync -av --progress old-dir/ .

rm -rf old-dir

Rsyncルールにより、重複をold-dirからの新しいファイルに置き換えます。

あなたが試すことができます

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

..の重複ファイルを上書きします。

Mv -u '{}'を使用して、..の重複が同じか新しい場合に上書きしないようにすることができます。

1
user591

mv -iは、宛先が存在する場合にのみプロンプトを表示します。

yes n | mv -i …は、宛先ディレクトリに存在しないすべてのファイルを移動します。 FreeBSDおよびOSXでは、これをmv -n …に短縮できます。

これらはどちらも、ディレクトリ引数を宛先ディレクトリ内の同じ名前の既存のディレクトリとマージしないことに注意してください。


別の問題は、現在のディレクトリ内のすべてのファイルにどのように作用するかです。 2つの問題があります。すべてのファイル(*はドットファイルを省略)を取得することと、コマンドラインで実行しないことです。 Linuxの場合(またはより一般的にはGNU find and 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を使用する場合は、それについて心配する必要はありません。また、Dglob修飾子を使用してドットファイルを無視しないように指示できます。制限:これはファイルシステム間では機能しません(zsh 4.3.10以降)。

zmodload zsh/files
mv -i -- *(D) ..

私たちのMLで言った

mv * ..

明らかにこれはあまり安全ではありません...上書きされます。それは私が遭遇したことのない限界があるかもしれません。

0
xenoterracide

以下は、私が過去に良い効果を上げてきた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
kasterma