나는 bash를 처음 접했기 때문에 이것이 어리석은 경우 사과드립니다.
나는 후속 조치를 취하고 있다이것find
HEIC 이미지를 JPG로 변환하는 방법에 대한 가이드입니다. 왜 실행 하고 계속 파이핑하면 wc
다른 결과가 나오는지 혼란스럽습니다 . 구체적으로,find
wc
temp=$(find . -maxdepth 1 -name "*.HEIC")
count=$(wc -l $temp)
$count
예상한 대로 계산 결과 단어 수가 포함된 파일 목록이 생성되었습니다. 그러나 기사와 같이 쓰면 다음과 같습니다.
count=$(find . -maxdepth 1 -name "*.HEIC" | wc -l)
그런 다음 .HEIC 확장자를 가진 파일 수를 계산합니다.
답변1
에서'남자 화장실'
wc [옵션]...[파일]...
각 FILE에 대한 개행 문자, 단어 수 및 바이트 수를 인쇄하거나 여러 FILE이 지정된 경우 총 행 수를 인쇄합니다.
count=$(wc -l $temp)
다음과 같이 평가됨
count=$(wc -l /path/to/file1 /path/to/file2 )
따라서 파일 수 대신 모든 파일의 줄 수를 계산합니다.
두 번째 줄을 다음으로 변경해야 합니다.
count=$(echo "$temp" | wc -l)
답변2
bash는 PowerShell(또는 내가 모르는 다른 것)이 아니고 left | right
명령줄 인수로 출력된 행이나 단어를 사용하여 호출을 수행하는 대신 right
내용이 다음과 같은 파이프에서 리디렉션된 stdin을 사용하여 출력이 실행됩니다. 에 기록 중입니다. 또한 순차적이 아닌 동시에 실행됩니다.left
right
left
left
right
wc -l
인수 없이 호출 하면 files
단순히 표준 입력의 줄 수를 셉니다. seq 1 2 | wc -l
인쇄됩니다 2
.
어쨌든 find . ... | wc -l
개행 문자가 포함된 파일 이름으로 인해 손상되기 쉽습니다. 이는 (불행히도) 매우 많이 허용됩니다. GNU find를 사용하면 다음과 같이 이 문제를 해결할 수 있습니다.
count=$(find . ... -name '*.HEIC' -printf _ | wc -c)
# or just
count=$(find . ... -name '*.HEIC' -printf _); count=${#count}
답변3
$(…)
echo는 후행 줄 바꿈을 잘라내고 echo는 줄 바꿈을 추가하므로 find
출력이 빈 줄로 끝나거나 완전히 비어 있는 경우 두 메서드의 답변이 다를 수 있다는 점도 주목할 가치가 있습니다 .
특히 $( echo "$temp" | wc -l )
0은 절대 아닙니다.