이 명령은 작동하지만 for 루프 내에서 사용하면 작동하지 않습니다.

이 명령은 작동하지만 for 루프 내에서 사용하면 작동하지 않습니다.

사용자 폴더에 있는 모든 사용자를 반복하고 각 홈 디렉터리에 있는 파일 수를 인쇄하려고 합니다. 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그러면 현재 디렉터리( )의 모든 파일 이름이 설정됩니다 . ./*각 파일에 대해 현재 디렉터리의 모든 파일 이름을 사용하여 다시 실행되어 출력 lswc -l $f. wc -l따라서 여기서 파이프 wc는 무시되고 에 지정된 파일을 읽으려고 시도하며 f디렉터리인 경우 실패합니다.

나는 이것이 당신이 원하는 것이라고 생각합니다

for f in ./* ; do ls "$f" | wc -l ; done

이는 lsin이라는 이름의 디렉토리에서 실행된 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

관련 정보