![경로 이름을 사용하여 파일 이름 바꾸기](https://linux55.com/image/38242/%EA%B2%BD%EB%A1%9C%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%20%EB%B0%94%EA%BE%B8%EA%B8%B0.png)
하위 폴더에 .bdf 파일이 있습니다. 모든 .bdf의 이름은 Loads.bdf와 같습니다.
예:
/home/user/folderxx/folderxxx/Load.bdf
/home/user/folderxx/folderxxx/Load.bdf
모든 Load.bdf 파일을 찾아서 새 폴더에 복사하고 경로 이름으로 이름을 바꿔야 합니다.
예: 예상된 작업 후에는 다음과 같이 표시되어야 합니다.
folder001_folderAAA_Load.bdf
folder002_folderBBB_Load.bdf
답변1
("Multiple Moves") 패키지 mcp
의 도구를 사용하겠습니다.mmv
mcp '/home/user/*/*/Load.bdf' '#1_#2_Load.bdf'
#1
두 번째 문자열의 etc.는 #2
첫 번째 문자열의 해당 첫 번째, 두 번째 등의 와일드카드 문자 내용으로 대체됩니다. 와일드카드가 mcp
셸이 아닌 셸에서 해석 되도록 경로를 작은따옴표로 묶습니다 .
표시된 명령을 사용하면 파일이 현재 디렉터리에 복사됩니다. mcp
로 바꾸면 mmv
파일이 이동됩니다.
답변2
이 작업은 실행하지 않거나 다음을 사용하여 여러 번 수행할 수 있습니다 prename
(많은 시스템에서 별칭으로 사용됨 ) .rename
mv
cp
cd /home/user
find . -type f -name 'Loads.bdf' -exec \
prename -n 's:^./::; s:/:_:g; s:^:destination/:' {} +
-n
원하는 파일이 이동되고 있다고 확신하면 삭제하세요.
고쳐 쓰다
파일을 이동하는 대신 복사하려면 먼저 cpio
또는 를 사용하여 복사한 pax
다음 이전과 같이 이름을 바꾸는 것이 가장 빠른 방법입니다. 예를 들어(GNU 사용 cpio
):
cd /home/user
find . -type f -name 'Loads.bdf | cpio -p --make-directories destination
cd destination
find . -type f -name 'Loads.bdf' -exec prename -n 's:^./::; s:/:_:g' {} +
pax
POSIX이자 LSB이고 cpio
더 이상 POSIX가 아니지만 여전히 cpio
많은 시스템에서 일반적인 프로그램입니다.
find
줄 바꿈과 함께 GNU/핸들 파일 이름을 사용하려면 to 및 to 를 cpio
추가하면 됩니다 .-print0
find
-0
cpio
업데이트 2
해결책 pax
은 한 줄입니다(포함되지 않음 cd
).
cd /home/user
find . -name 'Loads.bdf' | cut -d/ -f 2- | pax -rws ':/:_:g' destination
또는 파일 이름(및 GNU )의 경우 find
:
find /home/user -name 'Loads.bdf' -printf '%P\0' | pax -0rws ':/:_:g' destination
답변3
다른 답변(mcp, mmv 또는 prename 등)에 언급된 도구가 없는 시스템에서 이 작업을 수행해야 하고 쉘에서 완전히 수행하려는 경우 다음과 같이 할 수 있습니다. :
#!/usr/bin/env bash
oldpath="/home/user"
newpath="/home/user/newfolder"
for file in $(find $oldpath -type f -name Load.bdf); do
shortname=${file#$oldpath/}
newname="$newpath/${shortname//\//_}"
if [ -f $newname ]; then
echo "$newname already exists."
else
echo "copy: $file"
echo " --> $newname"
cp $file $newname
fi
done
Load.bdf
이 스크립트는 디렉터리에 지정된 모든 파일을 찾아 oldpath
디렉터리 이름을 새 파일 이름으로 병합한 다음 대상 디렉터리에 복사합니다. 여러 번 실행해야 하고 모든 파일을 다시 복사할 필요가 없는 경우를 대비하여 복사된 파일이 존재하는지 확인할 수도 있습니다.
최종 디렉터리 구조는 다음과 같습니다.
bash$ find . -type f
/home/user/folder001/folderAAA/Load.bdf
/home/user/folder002/folderBBB/Load.bdf
/home/user/folder003/folderCCC/Load.bdf
/home/user/newfolder/folder001_folderAAA_Load.bdf
/home/user/newfolder/folder002_folderBBB_Load.bdf
/home/user/newfolder/folder003_folderCCC_Load.bdf
답변4
env - sh <<\SCRIPT
t=/home/user/target f=folder
cd "${t%/*}" && mkdir -p "$t"
set -- $f??/$f???/Load.BDF
while [ -e "$1" ] ; do
cp "$1" "$t/$(IFS=/
printf '%s_%s_%s\n' $1)"
shift ; done
SCRIPT
나는 이것이 모두 완전히 이식 가능한 쉘 스크립트라고 생각합니다. 비록 처음에는 회의적이었지만 완료하는 것은 매우 간단했습니다.