파일 이름에 경로의 일부를 추가하여 파일을 찾아 이름을 바꿉니다.

파일 이름에 경로의 일부를 추가하여 파일을 찾아 이름을 바꿉니다.

두 가지 수준의 하위 폴더가 있는 폴더가 있습니다. 두 번째 하위 폴더에는 jpg 파일이 있습니다. 모든 jpg의 이름은 동일합니다.cover.jpg

예:

/home/user/folder001/folderAAA/cover.jpg
/home/user/folder002/folderBBB/cover.jpg
[...]
/home/user/folder999/folderZZZ/cover.jpg

모든 파일을 찾아서 새 폴더에 복사하고 cover.jpg이름을 바꿔서 첫 번째와 두 번째 하위 폴더의 이름을 파일 이름에 접두사로 추가해야 합니다.

예:
예상 작업 후 ot의 내용은 다음 /home/user1/newfolder과 같아야 합니다.

folder001_folderAAA_cover.jpg
folder002_folderBBB_cover.jpg
[...]
folder999_folderZZZ_cover.jpg

답변1

이는 sed 명령을 사용하여 쉽게 달성할 수 있습니다. 이름을 바꿔야 하는 파일 목록을 찾고 sed/echo 파일 경로를 사용하여 요구 사항을 충족합니다.

cd /home/user
for fl_nm in $(find . -type f -name "cover.jpg")
do
echo copying the file with desired name to new folder : $fl_nm
cp $fl_nm /home/user1/newfolder/$(echo ${i#*/*} | sed 's/\//_/g')
#Above copy command ignores the find result which extracts only file path from ./**file_path**
done

Cover.jpg라는 이름의 모든 파일은 파일 이름에 해당 폴더 세부 정보가 포함된 /home/user1/newfolder로 복사됩니다.

답변2

#! /bin/bash

target_dir_path="/copy/here"

for file in folder*/*/*.jpg; do
        l1="${file%%/*}"
        l2="${file#*/}"
        l2="${l2%%/*}"
        filename="${file##*/}"
        target_file_name="${l1}_${l2}_${filename}"
        echo cp "$file" "${target_dir_path}/${target_file_name}"
done

echo요구사항을 충족하는 경우 삭제하세요.

답변3

zsh에서 다음을 입력하세요.autoload zmv귀하의 것에서 .zshrc(또는 실험하려면 명령줄에서 이 명령을 실행하십시오) 다음을 수행하십시오.

mkdir /home/user1/newfolder
zmv '/home/user/(*)/(*)/(cover.jpg)' '/home/user1/newfolder/${1}_${2}_${3}'

왼쪽의 패턴과 일치하는 각 파일의 이름은 오른쪽의 대체 텍스트로 변경됩니다. *"모든 문자 시퀀스"를 의미합니다. 오른쪽에서 , ${1}${2}${3}각각 패턴의 첫 번째, 두 번째, 세 번째 대괄호 그룹과 일치하는 소스 경로 부분으로 대체됩니다.

명시적인 그룹화를 사용하는 대신 각 와일드카드가 자동으로 자체 그룹이 되도록 요청할 수 있습니다.

zmv -w '/home/user/*/*/cover.jpg' '/home/user1/newfolder/${1}_${2}_cover.jpg'

심지어:

zmv -W '/home/user/*/*/cover.jpg' '/home/user1/newfolder/*_*_cover.jpg'

일부는 다음과 같이 덧붙이기도 합니다.

alias zmmv='noglob zmv -W'

거기에 가서 ~/.zshrc글을 쓰세요:

zmmv /home/user/*/*/cover.jpg /home/user1/newfolder/*_*_cover.jpg

관련 정보