n個以上のファイルを含むサブフォルダーのコピー

n個以上のファイルを含むサブフォルダーのコピー

root_folderサブフォルダが多いフォルダがあります。各サブフォルダには少数のファイル(1〜20個)が含まれており、少なくとも5個のファイルを含むすべてのサブフォルダを別のフォルダにコピーしたいと思いますnew_folder。興味のあるフォルダを印刷する方法を見つけました。https://superuser.com/questions/617050/find-directories-include-a-certain-number-of-filesしかし、コピーする方法がわかりません。

答え1

検索結果に対してforループを実行し、-Rを使用してフォルダをコピーできます。

IFS=$'\n'
for source_folder in "$(find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; |  
awk -F"\t" '$NF>=5{print $1}');" do 
  if [[ "$source_folder" != "." ]]; then 
    cp -R "$source_folder" /destination/folder
  fi
done

答え2

あなたの場合は、次のスクリプトが機能します。

find . -mindepth 1 -maxdepth 1 -type d -print0 | while read -rd '' line
do  files=("$line"/* "$line"/.*)
count=${#files[@]};((count-=2))
if [ $count -ge 5 ]
then
cp -R "$line" ../newfolder/
fi
done

メモ:相対パスを使用しているため、これは既定のフォルダーで行う必要があります。

答え3

ディレクトリのサブディレクトリに移動します。

for subdir in root_folder/*/; do
  if [ -L "${subdir%/}" ]; then continue; fi
done

このif [ -L …行はディレクトリへのシンボリックリンクをスキップします。ディレクトリへのシンボリックリンクを含めたい場合、またはシンボリックリンクがないことがわかっている場合は、それを省略してください。

名前が.(ドットディレクトリ)で始まるディレクトリは含まれません。これを含めるには、bashで実行してくださいshopt -s dotglob

bashでディレクトリ内のファイル数を数えるには、そのファイルを配列に保存し、要素数を数えます。shopt -s nullglob空のディレクトリに対して0を取得するには、実行します(そうでない場合は、globパターンが*何も一致しない場合は拡張されていないため、0の代わりに1を取得します)。

したがって:

#!/bin/bash
shopt -s nullglob dotglob
for subdir in root_folder/*/; do
  if [ -L "${subdir%/}" ]; then continue; fi
  files=("$subdir"/*)
  if ((${#files[@]} >= 5)); then
    cp -Rp "$subdir" new_folder/
  fi
done

関連情報