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


10

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

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

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

注:CentOS 5.5を実行しているので、最新の機能が原因で機能しない場合はお知らせください...


ypuはdupeに対して何をしたいですか?

@Iainは状況に依存しますか?私はウェブホストで働いています...それは本当に、mvそしてその場合に私たちが保存を気にするかどうか、そして私たちがすでにバックアップを取っているかどうかに依存します。この質問はかなりオープンです。私はちょうど良いオプションを探しています、そしておそらくそれがあなたを噛むことができるかどうかとその方法についてのコメントです。
ゼノテラシッド

シェルが処理するにはファイルが多すぎると思いますmv * ../mv -i * ../
Michael Mrozek

@マイケル私はそれが変わると確信しています...いくつかのケースではおそらくそうではありません。場合によっては。私は私の仕事環境のできるだけ多くのオプションをキャッチしようとしています。
ゼノテラサイド

回答:


6

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

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

これにより、親の既存の重複ファイルがすべてfile -originalにバックアップされます


私が-a意味すると思う-r
ゼノテラサイド

@xenoterracide-Right 'r'
Tok

@Tokはハードリンクとしてコピーを行うことは可能ですか?IOを無駄にしないように。(のよう-lcp
xenoterracide 2010

@xenoterracide- rsync の-Hor --hard-linksフラグを使用して、ハードリンクを保持できます。
2010

1
@xenoterracide- --link-dest=DIRフラグを使用して、次のようにこの動作を実現rsync -avP --link-dest=/path/to/src /path/to/src/* /path/to/dest/できます。これは、srcとsrcの間のdst /変更されていないファイル、この場合はすべてのファイルにハードリンクします。通常、このフラグは、などのデータをコピーせずにバックアップファイルを再リンクする場合に使用されます--link-dest=/most/recent/backup
2010

4
cp -bal . ..

これは現在のディレクトリのすべてをその上のディレクトリにコピーし、すべての権限を保持し、ハードリンクを使用して可能な場合はIOを最小化し、複製時にファイル名を作成します〜

その後

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

おそらく、多数のファイルの問題が発生します...しかし、rsyncのようにIO集約的ではありません。
ゼノテラサイド

2

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

cd /parent

rsync -av --progress old-dir/ .

rm -rf old-dir

rsyncルールにより、dupはからの新しいファイルに置き換えられますold-dir


1

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

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

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

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


なぜパイプがxargsを見つけるのですか?+
xenoterracideを

1
@xenoterracide-習慣と移植性(これはGNU拡張機能です)。その上、私は試してみましたが、+が末尾に追加されるだけなので、2番目のパラメーター..mv '{}' +コマンドに渡す方法がわかりません。

@Iain + はPOSIXにありますが、実際には以前にGNUのfindがそれを取得するのが遅いと言われました。
xenoterracide 2010

あなただ右が、私はまだ..を使用する方法を理解することはできません

2
@xenoterracide:GNU coreutilsの場合:-exec mv -t .. -- {} +。ポータブル:-exec sh -c 'mv -- "$@"' _ {} +
Gilles「SO-悪をやめる」

1

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

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

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


別の問題は、現在のディレクトリ内のすべてのファイルにどのように作用するかです。2つの問題があります。すべてのファイルを*取得(ドットファイルを省略)し、コマンドラインに実行しない。Linux(またはより一般的にはGNU findとGNU coreutilsを使用):

find . -mindepth 1 -maxdepth 1 -exec mv -i -t .. -- {} +

GNU findを使用しても、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) ..

多くの議論に?
xenoterracide

0

私たちのMLで言った

mv * ..

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


2
多数のファイルがある場合、「引数リストが長すぎます」エラーが発生する可能性があります。

2
で始まるファイル名を使用すると、問題が発生する可能性があります-。名前がで始まるファイルをキャッチしません.
Gilles「SO-悪をやめる」

0

以下は、私が過去に有効に使用した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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.