질문

질문

질문

현재작업 목록나는 여러 개의 (매우 많은) 폴더를 가지고 있는데 그 중 일부에는 많은 수의 파일(예: 100,000개 이상)이 포함되어 있습니다.

내 목표는 10,000개 이상의 파일이 포함된 폴더만 가져오고 folderName10001.ext위 파일을 삭제하는 것입니다(여기서 포함 folderName된 폴더의 실제 이름은 무엇이며ext어느확장하다).

취해진 접근 방식

nameFolder numberOfFilesprint 을(를) 사용하려고 합니다 bash.

find . -maxdepth 1 -type d -name 'acer' -exec sh -c "echo {}; ls {} | wc -l" \;

이것은 잘 작동하지만(예제 폴더의 경우 acer) 출력은 다음과 같습니다.

./acer
6058

폴더당 한 줄의 출력을 원합니다.

find . -maxdepth 1 -type d -name 'acer' -exec sh -c "echo {} `ls {} | wc -l`" \;

설명하다 ls: cannot access {}: No such file or directory.


질문

  1. 한 행에 어떻게 표시할 수 있나요 nameFolder numberOfFiles?
  2. >를 folderName/folderName#.ext사용하여 모든 파일을 삭제하는 더 쉬운 방법이 있습니까 ?#10000

질문 2

자세한 내용은 현재 상황을 이해하는 데 도움이 될 수 있습니다.

다음 트리가 포함된 폴더가 있습니다.

.
├── a
│   ├── a1.ext
│   ├── a2.ext
│   ├── a3.ext
│   └── a4.ext
├── b
│   ├── b1.ext
│   ├── b2.ext
│   ├── b3.ext
│   └── b4.ext
└── c
    ├── c1.ext
    ├── c2.ext
    ├── c3.ext
    └── c4.ext

보다 큰 모든 숫자를 제거하고 싶습니다 2. (저의 경우에는 임계값이 로 설정됩니다 10000.)


답변 1

그것은 모든 것입니다WHO설명하다무엇(감사해요@블래치리의견에 대한 제안 사항).

을 입력 중이므로 bash먼저 bash무엇을 입력하고 있는지 설명하겠습니다. 내가 bash보내고 싶다면findbash백틱, 그럼 난 필요해탈출하다그것.

find . -maxdepth 1 -type d -name 'acer' -exec sh -c "echo {} \`ls {} | wc -l;\`" \;

이것은 나에게 준다

./acer 6058

@바마르 지적하나의-그리고큰따옴표다르게 행동하다,그러므로

find . -maxdepth 1 -type d -name 'acer' -exec sh -c 'echo {} `ls {} | wc -l`' \;

잘 작동할 것입니다( "로 대체하는 것에 주의하세요 ').

답변 2

이는 다음에서 제공됩니다.월터 A,이것은수락된 답변이 질문에 대해서.

추가 오류(아래 몇 가지 예)...

black: 390120
./clean.sh: line 6: /bin/ls: Argument list too long
rm: missing operand
Try 'rm --help' for more information.

leather: 118240
./clean.sh: line 6: /bin/ls: Argument list too long
rm: missing operand
Try 'rm --help' for more information.

알겠습니다. 해결했습니다.

ls -d */ | cut -d/ -f1 | while read dir; do
COUNT=$(ls $dir | wc -l);
   if [ ${COUNT} -gt 10000 ]; then
      echo "$dir: ${COUNT}" ;
      for i in `seq 10001 ${COUNT}`; do
         rm ${dir}/${dir}${i}.*
      done
   fi
done

답변1

$백틱이 원래 쉘에서 해석 되지 않도록 큰 따옴표 대신 작은 따옴표를 사용하십시오 .

find . -maxdepth 1 -type d -name 'acer' -exec sh -c 'echo {} $(ls {} | wc -l)' \;

두 번째 질문의 경우 디렉터리 이름을 매개변수로 사용하는 별도의 스크립트에 수행하려는 작업을 입력하겠습니다. 그런 다음 다음을 수행하십시오.

find . -maxdepth 1 -type d -name 'acer' -exec ./scriptname {} \;

이렇게 하면 -exec sh -c.

답변2

당신은 쓸 수 있습니다

ls -d */ | while read dir; do
    echo "$dir: $(ls $dir | wc -l)"
done

파일 이름 번호 앞에 0이 없으면 시도해 볼 수 있습니다.

ls -d */ | cut -d/ -f1 | while read dir; do
     COUNT=$(ls $dir | wc -l);
     echo "$dir: ${COUNT}" ;
     if [ ${COUNT} -gt 10000 ]; then
        ls ${dir}/${dir}?????*.ext | grep -v ${dir}/${dir}10000.ext | xargs rm
     fi
done

파일 이름 앞에 0이 있으면 다른 접근 방식을 취할 수 있습니다.

ls -d */ | cut -d/ -f1 | while read dir; do
   ls ${dir}/${dir}*.ext | tail -n +10001 | xargs rm
done

편집: ls 명령에 dir+filename을 포함하고 cut -d/ -f1 |후행 /를 자르는 기능을 추가했습니다.

관련 정보