경로 이름을 사용하여 파일 이름 바꾸기

경로 이름을 사용하여 파일 이름 바꾸기

하위 폴더에 .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(많은 시스템에서 별칭으로 사용됨 ) .renamemvcp

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' {} +

paxPOSIX이자 LSB이고 cpio더 이상 POSIX가 아니지만 여전히 cpio많은 시스템에서 일반적인 프로그램입니다.

find줄 바꿈과 함께 GNU/핸들 파일 이름을 사용하려면 to 및 to 를 cpio추가하면 됩니다 .-print0find-0cpio

업데이트 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

나는 이것이 모두 완전히 이식 가능한 쉘 스크립트라고 생각합니다. 비록 처음에는 회의적이었지만 완료하는 것은 매우 간단했습니다.

관련 정보