![많은 수의 파일을 날짜 구조의 디렉토리 순서로 복사](https://linux55.com/image/88815/%EB%A7%8E%EC%9D%80%20%EC%88%98%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%82%A0%EC%A7%9C%20%EA%B5%AC%EC%A1%B0%EC%9D%98%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%20%EC%88%9C%EC%84%9C%EB%A1%9C%20%EB%B3%B5%EC%82%AC.png)
약 40.0000개의 파일을 날짜 구조 폴더에 복사해야 합니다.
예시 파일:
/var/public/voicelogging/quality_monitoring/20151209/bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV
복사해야 하는 많은 파일 중 하나입니다./home/username/logging/
파일 이름에는 사용해야 하는 두 가지 변수가 있습니다.
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
날짜 디렉터리를 만들기 위해 한 줄짜리 코드를 만들었지만 사용자 ID 디렉터리는 직접 만들어야 합니다.
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
$2
zmv
-p
dtcp
mv
$1
--
$2
/var/public/voicelogging/quality_monitoring/(*)/(*).WAV'
$3
/home/username/logging/${${2%_*}##*_}/$1
-n
시운전;실제로 명령을 실행하려면 제거하세요.