
다음과 같이 각각 정확히 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
/
dirname
basename
${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'