我有一个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