サイズに応じてディレクトリ内のファイルをサブディレクトリにソート

サイズに応じてディレクトリ内のファイルをサブディレクトリにソート

そのため、ファイル(テキストファイル)でいっぱいのディレクトリがあります。ファイルをサイズに応じて別のサブディレクトリにソートしたいと思います。

たとえば、次より大きい場合1MB->large_files。未満の場合1MB->small_files

ディレクトリパス(入力/宛先)を変更できるようにしたいので、サブディレクトリがない場合は自動的に作成されます。

この問題をどのように処理するかは非常に混乱しています。

ありがとう

答え1

それはおそらく次のスクリプトでしょう:

#! /bin/sh -
dir=${1?Please specify the directory to sort}
cutoff=${2:-1048576} # bytes

cd -P -- "$dir" || exit
mkdir -p -- small_files large_files || exit

find . ! -name . -prune -type f '(' \
  -size "+${cutoff}c" -exec sh -c 'exec mv -- "$@" large_files' sh {} + -o \
                      -exec sh -c 'exec mv -- "$@" small_files' sh {} + ')'

GNUシステムでは、-vオプションを渡してより冗長にすることができmvますmkdir。 GNUツールを使用すると、次のように単純化できます。

#! /bin/sh -
dir=${1?Please specify the directory to sort}
cutoff=${2:-1M}

cd -P -- "$dir" || exit
mkdir -p -- small_files large_files || exit

find . -maxdepth 1 -type f '(' \
  -size "+$cutoff" -exec mv -t large_files {} + -o \
                   -exec mv -t small_files {} + ')'

このオプションを使用してターゲットディレクトリを指定した場合、-t呼び出しパラメータshの途中にファイル名のリストを挿入する必要はありません。mv

次のカテゴリを追加できます。

find . -maxdepth 1 -type f '(' \
  -size +1M   -exec mv -t large_files  {} + -o \
  -size +100k -exec mv -t medium_files {} + -o \
              -exec mv -t small_files  {} + ')'

を使用すると、zsh次のこともできます。

#! /bin/zsh -
dir=${1?Please specify the directory to sort}


cd -P -- "$dir" || exit

for size target (
  LG+1   huge_files
  LM+100 very_large_files
  LM+1   large_files
  LK+100 medium_sized_files
  L+100  small_files
  ''     tiny_files
) {
  mkdir -p $target || exit
  files=(*(NDoN.$size))
  (($#files == 0)) || mv -- $files $target || exit
}

答え2

not= && while :; do 
 while IFS= read -r -d '' f; do 
  [[ -z "${not}" ]] && target="large_files" || target="small_files"
  [[ ! -d "${target}" ]] && mkdir "${target}" 
  mv "${f} "${target}/${f}"
 done < <(find . -maxdepth 1 -type f ${not} -size +1000k -printf "%f\0" 2>/dev/random)
 [[ -n "${not}" ]] && break 
 not=!
done

外部forループは、ルックアップサイズを1Mより大きいものから1M以下に動的に変更します。エラーは次にリダイレクトされます/dev/random(Linuxを使用すると仮定してエントロピーに追加し、/dev/nullそうでない場合に変更/dev/random)。

設定する前に、ターゲットディレクトリをLarge_filesに変更するか、ターゲット${not}ディレクトリがない場合はターゲットディレクトリを作成します。次の反復では、${not}に設定され、!1M以下の(小さいか等しい)ファイルを見つけ、まだ存在しない場合はsmall_filesディレクトリを作成します。

ファイルが適切なディレクトリに移動されます。

最初に設定した後、not内部ループロジックが再び実行され、notループが中断されます。

注:nullバイトはより強力であるため、whileループ処理に使用され、IFS=nullバイト区切りリストを処理するために使用される内部フィールド区切り文字をオフにし、-d ''区切り文字をnullバイトに設定して-rバックスラッシュを削除/説明しないようにします。保護します。

関連情報