파일 이름을 바꾸고 상위 디렉토리 이름을 파일에 추가하려고 합니다(그리고 "Photos"라는 새 폴더로 이동합니다).
나는 이것을하려고 노력해 왔습니다.이름을 바꿔라그리고밀리미터파, 그러나 아래 예에서 디렉터리 A에 있을 때 이 작업을 수행하는 데 문제가 있습니다.
$ pwd
/A
$ tree
.
├── 1.jpg
├── 2.jpg
└── 3.jpg
그러나 폴더 계층 구조의 한 수준 위에서 이름 바꾸기를 실행하면 제대로 작동합니다.
$ pwd
/
$ tree
.
└── A
├── 1.jpg
├── 2.jpg
└── 3.jpg
$ rename 's|(.*)/(.*)|$1/Photos/$1 - $2|' */*.jpg -p
$ tree
.
└── A
└── Photos
├── A\ -\ 1.jpg
├── A\ -\ 2.jpg
└── A\ -\ 3.jpg
예제에서 "A" 디렉터리에 있을 때 이를 어떻게 달성할 수 있습니까?
답변1
rename
글쎄, 이것은 내가 가지고 있는 것보다 더 이국적이므로 먼저 sed를 사용해 보십시오.
Dir=$(basename "$PWD")
mkdir -p Photos
ls *.jpg|sed 's|\(.*\)|mv "\1" "Photos/'"$Dir"' - \1"|' |sh
나는 이것이 다음과 같이 이름을 바꾸는 것으로 해석될 것이라고 생각합니다.
Dir=$(basename "$PWD")
rename 's|(.*)|Photos/'"$Dir"' - $1|' *.jpg -p
답변2
확장됨앙드레 보드의 답변. 나는 또한 rename
이 명령으로 몇 가지 추가 실험을 수행했습니다. 네 가지 변형 모두 작동하며 아마도 더 깔끔하게 수행될 수 있습니다. 나는 AndreBeaud가 작은 eval
따옴표를 사용하지 않고 대신 작은 따옴표를 사용하여 문자열을 연결했다는 것을 알았습니다. 편리한.
짧지만 읽기가 조금 어렵습니다.
rename 's|.*/(.*)/(.*)|Photos/$1 - $2|' `pwd`/*.jpg --make-dirs
교체 섹션의 폴더 이름은 읽기 더 쉽습니다.
eval "rename 's|(.*)|Photos/$(basename `"pwd"`) - \$1|' *.jpg --make-dirs"
먼저 변수를 만듭니다. 이 경우에는 한 번만 사용되므로 중요하지 않습니다. 따라하기 쉽습니다.
Dir=$(basename `"pwd"`); eval "rename 's|(.*)|Photos/$Dir - \$1|' *.jpg --make-dirs"
변수가 먼저 나오는데 검색 부분에 폴더 이름이 있어서 굉장히 지저분합니다.
Dir=$(basename `"pwd"`); rename 's|.*/(.*)/(.*)|Photos/$1 - $2|' ../$Dir/*.jpg --make-dirs
AndreBeaud와 내 버전을 결합하면 다음과 같은 짧은 버전이 됩니다.
rename 's|(.*)|Photos/'"$(basename "$PWD")"' - $1|' *.jpg --make-dirs