それで私は小さな間違いをしました。ソースからデータを収集する過程で、すべてを外部ディスクのルートにダンプしました。私がやりたいことのいくつかのオプションは次のとおりです。
- 特定の数のファイルをディスクからハードドライブに移動します。
- サブフォルダ(それぞれ1000個のファイルを含む)を作成し、フォルダ間にファイルを配布します。
- ファイル全体またはファイルの一部(50,000ファイルなど)を圧縮してマイディスクに移動します。
しかし、いくら努力しても永遠にかかるようです。誰もがこれらのタスクを実行する最も効果的な/最も効率的な方法を理解するのに役立ちますか?ありがとうございます。
答え1
次に、名前付きサブディレクトリを作成し、次に..new
という番号の付いた50個のnew
サブディレクトリを作成します。次に、現在のディレクトリから各ディレクトリに最大1000個のファイルを移動します。new/01
new/50
new/*
注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 -1
xargs
mv
#! /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