엄청난 수의 파일을 날짜 구조의 디렉토리 순서로 복사

엄청난 수의 파일을 날짜 구조의 디렉토리 순서로 복사

약 40.0000개의 파일을 날짜 구조 폴더에 복사해야 합니다.
예제 파일:

/var/public/voicelogging/quality_monitoring/20151209/bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV

복사해야 하는 많은 파일 중 하나입니다./home/username/logging/

파일 이름에는 사용해야 하는 2개의 변수가 있습니다.

bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV

20151209물론 날짜는
12434파일을 만든 사용자의 ID입니다.

나에게 필요한 것은 디렉토리에서 사용자 ID를 검색할 수 있는 스크립트/하나의 라이너입니다.

그런 다음 에 사용자 ID를 사용하여 디렉토리를 만듭니다 /home/username/logging. 폴더를 생성한 후에는 찾을 수 있는 모든 날짜에 대한 디렉터리를 생성해야 합니다.
그리고 모든 파일을 올바른 디렉토리에 배치하십시오 userid/date.
결과 디렉토리의 예.

/home/username/logging/12434/20151209/bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV

날짜 dir을 만들기 위해 한 줄짜리 코드를 만들었지만 여전히 사용자 ID를 dir로 직접 만들어야 합니다.

find /var/public/voicelogging/quality_monitoring/ -type f -name "*12434*" | sed -r 's/^.{65}//' | cut -c1-8 | xargs -I {} mkdir {} /home/username/logging/12434

올바른 파일을 올바른 위치에 어떻게 복사할 수 있나요?

답변1

find및 를 사용하는 편도 install:

find /var/public/voicelogging/quality_monitoring -name \*.WAV -exec sh -c '
bn=${0##*/}; x=${bn%%-*}; dt=${x##*_}; y=${bn%_*}; id=${y##*_} 
install -D "$0" "/home/username/logging/${id}/${dt}/${bn}"' {} \;

이는 매개변수 확장을 사용하여 파일 이름에서 날짜: ${dt}및 사용자 ID:를 추출한 다음 다음을 사용합니다.${id}install각 파일을 해당 userID/date디렉터리에 복사하려면(내가 게으른 탓입니다) - install마지막 줄을 다음으로 바꾸지 않고:

dest=/home/username/logging/${id}/${dt}; mkdir -p "${dest}" && cp "$0" "${dest}"' {} \;

해당 "날짜" 디렉터리를 반복하고 .WAV각 디렉터리의 파일을 반복하려는 경우:

for d in /var/public/voicelogging/quality_monitoring/*; do
  dt=${d##*/}
  for f in $d/*.WAV; do
    bn=${f##*/}; y=${bn%_*}; id=${y##*_}
    dest=/home/username/logging/${id}/${dt}
    mkdir -p "${dest}" && cp "${f}" "${dest}"
  done
done

가지고 있는 경우 zsh더 쉽고 짧습니다 zmv(또한 zsh가 더 똑똑하고 변수 확장을 중첩할 수 있기 때문에 예를 들어 ${${file%_*}##*_}사용자 ID를 추출하는 데 충분할 것입니다).

dtcp () {                                                                     
mkdir -p $3 && cp $1 $2 $3
}
autoload zmv
zmv -n -p dtcp '/var/public/voicelogging/quality_monitoring/(*)/(*).WAV' \
'/home/username/logging/${${2%_*}##*_}/$1'

s 는 두 번째 매개변수에서 등 (*)으로 사용할 수 있는 역참조를 생성합니다 $1. 여기서 with는 대신 함수를 실행합니다 . 이 함수는 디렉터리를 생성한 다음 파일을 새로 생성된 디렉터리에 복사합니다. 인수(위의 역참조와 혼동하지 말 것)는 다음과 같습니다. : 옵션의 끝을 의미합니다 . : 복사해야 할 파일이고 : 대상입니다 . Note는 다음 을 의미합니다.$2
zmv-pdtcpmv
$1--

$2/var/public/voicelogging/quality_monitoring/(*)/(*).WAV'

$3/home/username/logging/${${2%_*}##*_}/$1

-n드라이런; 실제로 명령을 실행하려면 제거하십시오.

관련 정보