쉘 스크립트: 파일 경로의 일부를 파일 이름으로 사용하는 방법은 무엇입니까?

쉘 스크립트: 파일 경로의 일부를 파일 이름으로 사용하는 방법은 무엇입니까?

다음과 같이 정확히 1개의 JPEG 이미지가 포함된 디렉토리 세트가 있습니다.

/psds/folder1/image.jpg
/psds/someotherfolder/picture.jpg
/psds/yetanotherfolder/thumbnail.jpg

jpeg의 이름을 포함 폴더의 이름으로 바꾸는 올바른 방법은 무엇입니까? 내가 원하는 것은:

/psds/folder1/folder1.jpg
/psds/someotherfolder/someotherfolder.jpg
/psds/yetanotherfolder/yetanotherfolder.jpg

답변1

디렉터리에서 다음 명령을 실행합니다 /psds.

for f in ./*; do
    if [ -d "$f" ] ; then
        cd "$f"
        mv *.jpg "$f.jpg"
        cd ..
    fi
done

/psds아래와 같이 디렉터리에 3개의 폴더가 있는 경우

/psds/folder1/image1.jpg
/psds/folder2/image2.jpg
/psds/folder3/image3.jpg

위 명령을 실행하면 파일 이름이 다음과 같이 변경됩니다.

/psds/folder1/folder1.jpg
/psds/folder2/folder2.jpg
/psds/folder3/folder3.jpg

답변2

당신은 그것을 사용할 수 있습니다쉘 매개변수 확장지정된 접두사 또는 접미사를 뺀 변수 값을 구성 ${VAR#PREFIX}하고 가져옵니다. ${VAR%SUFFIX}PREFIX가 패턴인 경우 ##또는 를 사용하여 가장 짧은 일치 문자열이 제거되고 %%가장 긴 일치 문자열이 제거됩니다. 이러한 구성은 bash뿐만 아니라 모든 sh-type(Bourne/POSIX) 셸에서 사용할 수 있습니다.

값이 VAR그런 경로인 경우 파일이 포함된 디렉터리이며 /path/to/directory/file디렉터리 부분이 없는 파일 이름입니다. 이는 적어도 하나를 포함하고 다음으로 끝나지 않는 경우에만 정확합니다. 이와 관련하여 더 신뢰할 수 있는 유틸리티도 있습니다. 마지막 확장도 마찬가지다."${VAR%/*}""${VAR##*/}""${VAR%/*}"$VAR/"${VAR##*/}"VAR/dirnamebasename${VAR##*.}

for x in /psds/*/*.jpg; do
  dir="${x%/*}"
  mv "$x" "$dir/${dir##*/}.jpg"
done

늘 그렇듯이 zsh는 다소 신비롭지만 짧고 유용한 작업 방식을 가지고 있습니다. 이것zmv이 기능을 사용하면 파일 이름을 일괄적으로 쉽게 바꿀 수 있습니다.

autoload -U zmv   # put this in your .zshrc
zmv '/psds/(*)/*.jpg' '/psds/$1/$1.jpg'

또 다른 사용 방법역사 확장 수정자매개변수 확장에 관해:

zmv '/psds/*/*.jpg' '$f:h/$f:h:t.$f:e'

관련 정보