사용자 폴더에 있는 모든 사용자를 반복하고 각 홈 디렉터리에 있는 파일 수를 인쇄하려고 합니다. Users 디렉토리에 있을 때 실험하기
ls ./<someusername> | wc -l
이 명령은 내가 원하는 것을 인쇄합니다. for 루프에서 사용하면 ...
for f in ./*; do ls ./* | wc -l $f; done
그것은 나에게 주었다
wc: ./user1: read: Is a directory
wc: ./user2: read: Is a directory
wc: ./user3: read: Is a directory
wc: ./user4: read: Is a directory
사용자의 번호나 폴더가 아닌 누구든지 나를 도울 수 있다면 감사하겠습니다. 나는 한동안 이 문제를 해결해 왔습니다.
답변1
for f in ./*; do ls ./* | wc -l $f; done
f
그러면 현재 디렉터리( )의 모든 파일 이름이 설정됩니다 . ./*
각 파일에 대해 현재 디렉터리의 모든 파일 이름을 사용하여 다시 실행되어 출력 ls
을 wc -l $f
. wc -l
따라서 여기서 파이프 wc
는 무시되고 에 지정된 파일을 읽으려고 시도하며 f
디렉터리인 경우 실패합니다.
나는 이것이 당신이 원하는 것이라고 생각합니다
for f in ./* ; do ls "$f" | wc -l ; done
이는 ls
in이라는 이름의 디렉토리에서 실행된 f
다음 그 안의 행 수를 계산합니다. 그러나 ls
이름이 점으로 시작하는 파일은 무시될 수 있으며( 및 ls -A
를 건너뛰고 .
해당 파일 도 나열 ..
), glob은 일반 파일과 일치할 수도 있습니다(해당 홈 디렉토리에 있는 경우).
하지만 실제로는 그럴 필요가 없거나 ls
전혀 없습니다 wc
. OS X에는 Bash가 있어야 하며 다음과 같이 작동합니다.
shopt -s dotglob # '*' matches files with a leading dot, too
for f in ./*/ ; do # trailing slash only picks directories
set -- "$f"/* # fill the positional params with the filenames in the dir
echo "$f $#" # print the directory name and number of params/files
done