두 가지 수준의 하위 폴더가 있는 폴더가 있습니다. 두 번째 하위 폴더에는 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