1000 個のファイルを含むフォルダーから 20 個のファイルを番号付きフォルダーに再帰的に移動する方法

1000 個のファイルを含むフォルダーから 20 個のファイルを番号付きフォルダーに再帰的に移動する方法

1000 個 (またはそれ以上) のファイルでいっぱいのフォルダがあります。番号付きのフォルダを作成し、最初の 20 個のファイル (名前順) をそのフォルダに移動するスクリプトが必要です。次に、他のファイルについても同様に実行し、フォルダ番号を 1 ずつ増やして、すべてのファイルがフォルダに入るようにします。

次のコマンドを試しましたが、ディレクトリ全体を自動的に実行せず、フォルダー番号も自動的に増加しません。

N=1000;
for i in ${srcdir}/*; do
  [ $((N--)) = 0 ] && break
  cp -t "${dstdir}" -- "$i"
done

これをbashでどうやったら実行できるでしょうか?

答え1

このスクリプトは、パーティションを作成するディレクトリとパーティション サイズという 2 つの (オプションの) 引数を取ります。ファイルのみを移動するのか、すべてを移動するのかを指定していないため、ファイルのことを意味していると想定し、find コマンドを使用しました。

いくつかのコメント、

  • シェルを指定しなかった場合、このようなことは perl、ruby、または python でより簡単に実行できます。
  • maxdepth 1のfindはディレクトリのみを検索します
  • フォルダ名を変更するだけで、ファイルをどこにでも移動できます
  • find が使用されるため、-name、-mtime、-ctime などを追加できます。

コピーサム.sh、

#!/bin/bash
path=${1:-"."} #directory to start
howmany=${2:-20} #partition size
pushd $path; #move there
part=1; #starting partition
LIST="/usr/bin/find -maxdepth 1 -type f" #move only files?
#LIST="ls" #move everything #be careful, $folder will get moved also :-)
count=`$LIST |/usr/bin/wc -l`; #count of files to move
while [ $count -gt 0 ]; do
    folder="folder-$part";
    if [ ! -d $folder ]; then /usr/bin/mkdir -p $folder; fi
    /usr/bin/mv `$LIST |/usr/bin/sort |/usr/bin/head -$howmany` $folder/.
    count=`$LIST |/usr/bin/wc -l`; #are there more files?
    part=$(expr $part + 1)
done
popd $path

これはテスト用のスクリプトです(余分な 1000 個のファイルはなかったので)。

for f in 0 1 2 3 4 5 6 7 8 9; do
  for g in 0 1 2 3 4 5 6 7 8 9; do
    for h in 0 1 2 3 4 5 6 7 8 9; do
        touch $f$g$h
    done
  done
done

答え2

filesName が対応する数字で終わっているのに、シェルが である場合は、ループは1 回だけでfor十分ですzsh

for N in {0..800..20}: do
    mkdir "dir$N"
    mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

にある場合はbash、次のようになります。

for N in {0..800..20}: do
    mkdir "dir$N"
    eval mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

学習投稿:シーケンスのシェル中括弧展開で $variable を使用するにはどうすればよいですか?

関連情報