2017-05-16 7 views
3

나는이 문제가 무엇인지 완전히 알고있다.와일드 카드를 사용하지 않고 유닉스 디렉토리의 내용을 반복 처리하려면 어떻게해야합니까?

'cat.jpg'및 'dog.jpg'로 시작하는 파일 세트가 있습니다. "cat.jpg"파일을 'cat'이라는 디렉토리로 옮기고 싶습니다. 'dog.jpg'파일과 동일합니다. 괜찮

mv: cannot stat '*.jpg': No such file or directory

:

for f in *.jpg; do 
    name=`echo "$f"|sed 's/ -.*//'` 
    firstThreeLetters=`echo "$name"|cut -c 1-3` 
    dir="path/$firstThreeLetters" 
    mv "$f" "$dir" 
done 

나는이 메시지가 나타납니다. 그러나 와일드 카드를 사용하지 않고 이러한 이미지를 반복 할 방법을 찾을 수 없습니다.

와일드 카드를 사용하고 싶지 않습니다. 유일한 파일 앞에는 '개'또는 '고양이'가 붙습니다. 나는 그럴 필요가 없다. 모든 파일은 .jpg입니다.

와일드 카드를 사용하지 않고 디렉토리의 내용을 반복 할 수 없습니까? 나는 이것이 약간의 XY 문제라는 것을 알고 있지만 아직도 이것을 배우고 싶습니다.

+0

이 오류 메시지는 현재 디렉토리에 .jpg 파일이 없음을 나타냅니다. 이 스크립트를 실행할 때 올바른 디렉토리에 있습니까? –

답변

3

*.jpg은 일치하는 파일이 없을 때 문자가 *.jpg이됩니다. nullglob이 필요합니다. Bash를 사용하면 다음 작업을 수행 할 수 있습니다.

#!/bin/bash 

shopt -s nullglob    # makes glob expand to nothing in case there are no matching files 
for f in cat*.jpg dog*.jpg; do # pick only cat & dog files 
    first3=${f:0:3}    # grab first 3 characters of filename 
    [[ -d "$first3" ]] || continue # skip if there is no such dir 
    mv "$f" "$first3/$f"   # move 
done 
+0

"문제는 와일드 카드가 아니라 너무 포괄적이라는 사실입니다." 왜? 내가 갖고있는 것은 jpg 디렉토리뿐입니다. 숨겨진 파일이 없습니다 ... 무엇을 포함합니까? –

+0

'* .jpg'는'cat' 또는'dog'로 시작하는 것들을 원할 때 모든 jpg 파일과 일치합니다. – codeforester

+0

나를 위해 다행히도, 디렉토리의 유일한 파일 앞에는 '개'또는 '고양이'가 붙습니다. 일치시킬 필요가 없습니다 ... 모든 파일은 .jpg입니다! 이것은 문제가되지 않습니다. 나는 문제가'mv "$ f" "$ dir"'에 도착할 때까지 와일드 카드 심볼을 사용하는 것과 관련이 있다고 생각한다. –