다음과 같이 정확히 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'