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