多数のファイルを含むフォルダからファイルをコピー/圧縮する方法は?

多数のファイルを含むフォルダからファイルをコピー/圧縮する方法は?

それで私は小さな間違いをしました。ソースからデータを収集する過程で、すべてを外部ディスクのルートにダンプしました。私がやりたいことのいくつかのオプションは次のとおりです。

  1. 特定の数のファイルをディスクからハードドライブに移動します。
  2. サブフォルダ(それぞれ1000個のファイルを含む)を作成し、フォルダ間にファイルを配布します。
  3. ファイル全体またはファイルの一部(50,000ファイルなど)を圧縮してマイディスクに移動します。

しかし、いくら努力しても永遠にかかるようです。誰もがこれらのタスクを実行する最も効果的な/最も効率的な方法を理解するのに役立ちますか?ありがとうございます。

答え1

次に、名前付きサブディレクトリを作成し、次に..newという番号の付いた50個のnewサブディレクトリを作成します。次に、現在のディレクトリから各ディレクトリに最大1000個のファイルを移動します。new/01new/50new/*

注1:以下のいずれかの状況が発生した場合、この方法は機能しません。ファイル名\nその中に改行文字( )があります。

注2:これにはGNUxargsとGNUが必要ですmv。 Linuxを実行しているので、これが標準です。

必要に応じて数字(50と1000)とデフォルトのディレクトリを変更できます。

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"
done

移動するファイルがすべて特定のパターンと一致する場合は、検索または-nameオプション-regexを使用して選択できます。直後にオプションを追加します-type f。たとえば、.txtファイルだけを移動したい場合:

find . -maxdepth 1 -type f -name '*.txt' | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"

GNU以外のバージョンは機能しませんmv -t。また、オプションでは機能しませんが、入力のために改行文字をNUL文字に変換するxargs -dために使用できますtr '\n' '\0'。つまり、 xargs -0rファイル名に文字が含まれていないすべてのファイルが処理されます。はい non-posix、はい freebsd 拡張、このオプションは安全に削除できますが、ジョブの実行速度がはるかに遅くなります。\n-R -1xargsmv

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | tr '\n' '\0' | xargs -0r -R -1 -I % mv % "$BASEDIR/$i"
done

関連情報