경로의 디렉터리 이름을 기준으로 파일 추가(이름 바꾸기) 및 이동

경로의 디렉터리 이름을 기준으로 파일 추가(이름 바꾸기) 및 이동

목표: 해당 파일만 추가(이름 바꾸기) 및 이동경로에 다음이 포함됨모든 수준의 특정 디렉터리 이름입니다.

디렉터리 이름을 기반으로 트리에서 파일을 추출합니다. 수년간 정기적으로 이동한 백업에서 해당 디렉터리의 파일을 추출(이동)해 보세요.어느상위 디렉토리성냥미디어 디렉터리 목록의 이름을 사용자 정의합니다. 전체 경로를 각 파일의 접두사로 추가하고 추가된 파일을 단일 OUTPUT 디렉터리에 배치합니다. (파일 확장자를 선택기로 사용하는 것은 내 목적에 맞지 않습니다. 상위 디렉터리 이름 중 하나여야 합니다.) 예를 들어,

입력 디렉터리(각 디렉터리에는 많은 하위 디렉터리가 있음):

20011231-bkp-1
20021231-bkp-2
20031231-bkp-3

출력(단일 "OUTPUT" 디렉터리의 추가 파일):

20011231-bkp-1__dir-a__dir-b__dir-c__WhatsApp Images__imag-1.jpg
20021231-bkp-2__dir-a__dir-b__dir-c__WhatsApp Images__Sent__imag-1.jpg
20031231-bkp-3__dir-a__Camera__imag-1.mp4
20031231-bkp-3__dir-a__Camera__dir-x__imag-1.mp4

미디어 디렉터리 목록(이러한 디렉터리는 경로의 어느 위치에나 위치할 수 있습니다. 공백에 유의하세요.) 모든 파일의 이름을 바꾸고 이동하세요.정확히 일치하는 것, 재귀적으로:

WhatsApp Images
WhatsApp Audio
Recorders
Camera

이는 부착 및 이동에 효과적이지만 난이도가 제한됩니다.오직"미디어 디렉토리 목록"의 해당 파일에:

find 1 -type f| perl -ne 'chop;$from=$_;$to=$_;$to=~s/\//__/g;system("echo mv $from $to")'

답변1

나는 다음을 사용할 것이다 find -path "..." -exec bash -c '...':

find *-bkp-* \
  \( \
    -path "*/WhatsApp Images/*" \
    -or -path "*/WhatsApp Audio/*" \
    -or -path "*/Recorders/*" \
    -or -path "*/Camera/*" \
  \) \
  -exec bash -c '
    OUTPUT_DIR="OUTPUT"
    mkdir -p "$OUTPUT_DIR"
    for f in "$@"; do mv -v "$f" "$OUTPUT_DIR/${f//\//_}"; done
  ' find-sh {} +

-n기존 파일을 덮어쓰지 않고 기존 파일을 -f강제로 덮어쓰거나 백업하는 등 기존 파일에 발생해야 하는 작업을 제어하는 ​​플래그를 추가할 수 있습니다 -b.

관련 정보