そのため、ファイル(テキストファイル)でいっぱいのディレクトリがあります。ファイルをサイズに応じて別のサブディレクトリにソートしたいと思います。
たとえば、次より大きい場合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
}