复制至少包含 n 个文件的子文件夹

复制至少包含 n 个文件的子文件夹

我有一个root_folder包含很多子文件夹的文件夹。每个子文件夹都包含少量文件(1 到 20 个之间),我想将包含至少 5 个文件的所有子文件夹复制到另一个文件夹中new_folder。我找到了如何打印我感兴趣的文件夹:https://superuser.com/questions/617050/find-directories-containing-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 …行跳过目录的符号链接。如果您想包含目录的符号链接或者您知道不会有任何符号链接,请忽略它。

名称以 a 开头的目录.(点目录)将不包括在内。要包含它们,请在 bash 中运行shopt -s dotglob.

要计算目录中文件的数量,在 bash 中,将它们存储在数组中并计算元素的数量。运行shopt -s nullglob以获取空目录的 0(否则,如果 glob 模式*不匹配任何内容,则它保持未展开状态,因此您将得到 1 而不是 0)。

因此:

#!/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

相关内容