多くのフォルダを含むディレクトリがあり、100を超えるファイルを含むフォルダを移動したいと思います。
私はこれを行うつもりです:
find . -type d | while read d; do if
今これは私にとって難しい部分です。
各ディレクトリに移動して、100個以上のファイルが含まれていることを確認するためにforを実行しますか?では、どうすればよいですか?
for f in *; do cd $f; ll | wc; ?
ディレクトリ内のファイルの総数を取得し、そのディレクトリを移動する方法は少し混乱します(100を超えるファイルが含まれています)。
ベストアンサー1
ディレクトリに隠されていない名前の数を数えるには、dir
次のようにします。
set -- dir/*
これにより、*
ディレクトリ内のglobが展開され、位置引数が結果名に設定されます。パターンが一致した場合何もないなら数はです$#
。
特定の最上位ディレクトリのすべてのディレクトリを繰り返すには、top-dir
各ディレクトリの名前数を数え、100を超える名前のディレクトリに対していくつかの操作を実行します。
for subdir in top-dir/*/; do
set -- "$subdir"/*
if [ -e "$1" ] && [ "$#" -gt 100 ]; then
# do something to "$subdir"
fi
done
bash
シェルでnullglob
シェルオプションを設定すると、set
コマンドが名前と一致するかどうかを確認する必要はありません。
shopt -s nullglob
for subdir in top-dir/*/; do
set -- "$subdir"/*
if [[ $# -gt 100 ]]; then
# do something to "$subdir"
fi
done
また、dotglob
シェルオプションを設定すると、コード内のすべてのパターンが隠された名前と一致するようになります。
上記のコードスニペットでは、「do some to "$subdir"
」コメントは、そのサブディレクトリで実行する必要がある操作に置き換えることができます。たとえば、邪魔にならない場所に移動するには、次のようにします。
mv "$subdir" some/other/dir
これにより、そのファイルがディレクトリに移動されますsome/other/dir
。