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