n개 이상의 파일이 포함된 하위 폴더 복사

n개 이상의 파일이 포함된 하위 폴더 복사

root_folder하위 폴더가 많은 폴더가 있습니다 . 각 하위 폴더에는 적은 수의 파일(1~20개)이 포함되어 있으며 최소 5개 파일이 포함된 모든 하위 폴더를 다른 폴더에 복사하고 싶습니다 new_folder. 관심 있는 폴더를 인쇄하는 방법을 찾았습니다.https://superuser.com/questions/617050/find-directories-포함-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

관련 정보