이 스크립트는 디렉토리에 있는 100바이트 미만의 모든 파일의 파일 크기와 이름을 인쇄해야 합니다. 제가 작성한 이 스크립트는 Ubuntu에서는 완벽하게 실행되지만 Mac OS Lion에서는 작동하지 않습니다. 누구든지 이유를 말해 줄 수 있습니까?
#!/bin/bash
for i in $(ls)
do
if [[ $(wc -c $i | cut -d" " -f1) -le 100 ]]; then
echo $(wc -c $i)
fi
done
답변1
우와. 이미보다 더 어렵게 만들고 있는 것 같습니다.
find . -size -100c -exec stat -c "%s : %n" {} \;
완벽한.
답변2
이 문서를 참조하세요:중첩된 bash if/and/or 문이 OS X에서 Ubuntu로 작동하지 않습니다.
Ubuntu는 를 사용하는데 , OSX에서 무엇을 사용하는지 dash
잘 모르겠습니다 . bash
두 시스템 모두에서 동일한 쉘을 사용하고 있는지 확인하려면 이것을 맨 위에 놓으십시오.
#! /usr/bin/env bash
-또는-
#!/bin/bash
echo $SHELL
명령줄에서 어떤 셸을 사용하고 있는지 확인할 수도 있습니다 . 스크립트를 사용하면 bash
상단에 다음 줄을 추가하여 디버깅을 켤 수 있습니다.
set -x
예를 들어
% ls -l
total 4
-rw-rw-r-- 1 saml saml 0 Jan 30 20:30 a1
-rw-rw-r-- 1 saml saml 0 Jan 30 20:30 a2
-rwxrwxr-x 1 saml saml 151 Jan 30 20:45 a.bash
% ./a.bash
0 a1
0 a2
set -x 활성화 후
% ./a.bash
++ ls
+ for i in '$(ls)'
++ wc -c a1
++ cut '-d ' -f1
+ [[ 0 -le 100 ]]
++ wc -c a1
+ echo 0 a1
0 a1
+ for i in '$(ls)'
++ wc -c a2
++ cut '-d ' -f1
+ [[ 0 -le 100 ]]
++ wc -c a2
+ echo 0 a2
0 a2
+ for i in '$(ls)'
++ wc -c a.bash
++ cut '-d ' -f1
+ [[ 123 -le 100 ]]
자원
답변3
단일 외부 프로세스를 사용하도록 리팩터링되었습니다.
for i in *; do
wc=$(wc -c <"$i")
case $wc in 100 ) ;; ???* ) continue ;; esac
echo "$wc $i"
done
인용에 주의하고 리디렉션을 사용하여 필요를 피하고 cut
와일드카드 패턴을 사용하여 세 자리 이상의 숫자가 100보다 크거나 같다는 사실을 활용하세요.
(코드에 100보다 작거나 같다고 나와 있지만 문제 설명은 실제로 100보다 작습니다. 100) ;;
코드가 잘못되었고 질문이 올바른 경우 사례를 제거할 수 있습니다.)
wc -c
바이트 수가 아니라 문자 수가 계산됩니다. 가변 길이 텍스트나 멀티바이트 인코딩(예: 유니코드)의 경우에는 다릅니다 .