질문
현재작업 목록나는 여러 개의 (매우 많은) 폴더를 가지고 있는데 그 중 일부에는 많은 수의 파일(예: 100,000개 이상)이 포함되어 있습니다.
내 목표는 10,000개 이상의 파일이 포함된 폴더만 가져오고 folderName10001.ext
위 파일을 삭제하는 것입니다(여기서 포함 folderName
된 폴더의 실제 이름은 무엇이며ext
어느확장하다).
취해진 접근 방식
nameFolder numberOfFiles
print 을(를) 사용하려고 합니다 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
.
질문
- 한 행에 어떻게 표시할 수 있나요
nameFolder numberOfFiles
? - >를
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
보내고 싶다면find
bash
백틱, 그럼 난 필요해탈출하다그것.
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 |
후행 /를 자르는 기능을 추가했습니다.