내 문제: 이름은 같지만 하위 디렉토리에 1레벨 깊이 저장된 로그 파일을 복사하고 이름을 변경해야 합니다.
여러 폴더가 포함된 Logfiles라는 폴더에서 복사하고 있습니다.
W3SVC114
, W3SVC1507562355
, W3SVC350179472
, 등.
각 폴더에는 다음 이름의 파일이 포함됩니다. u_ex[YYMMDD].log
여기서 [YYMMDD]는 날짜 스탬프입니다.
이 모든 로그 파일을 하나의 폴더에 넣어야 합니다. 모든 이름이 동일하므로 결과 파일 이름에 디렉터리 이름을 추가하고 싶습니다. 예를 들면 다음과 같습니다.
W3SVC1507562355/u_ex150407.log
~이 되다W3SVC1507562355_u_ex150407.log
이 모든 일이 일어나도록 하려면 어떻게 해야 합니까? 좀 과하지 않네요...:-/
답변1
지쉬이름이 있는zmv
이를 통해 파일을 쉽게 이동하거나 복사하고 패턴 기반 변환을 이름에 적용할 수 있습니다. 이것을 당신의 것에 넣으십시오 .zshrc
(또는 명령줄에서 실행하십시오):
autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
그런 다음 다음과 같은 명령을 사용하여 이름 바꾸기 복제를 수행할 수 있습니다.
zcp 'Logfiles/(*)/(*.log)' 'destination_directory/${1}_$2'
zcp -w 'Logfiles/*/*.log' 'destination_directory/${1}_${2}.log'
zcp -W 'Logfiles/*/*.log' 'destination_directory/*_*.log'
zsh를 설치하지 않으려면 루프를 사용하여 모든 셸에서 동일한 작업을 수행할 수 있습니다.
cd Logfiles
for x in */*.log; do
cp -- "$x" "destination_directory/${x%/*}_${x##*/}"
done
답변2
다음 스크립트를 사용하여 파일을 한 위치에서 다른 위치로 복사하고 이름을 수정할 수 있습니다.
참고: 다음 스크립트에서는 두 개의 값을 하드코딩했습니다.
/로그 파일/:- 로그 파일 이름을 파일을 복사해야 하는 유효한 폴더 이름으로 변경합니다.
/tmp/:- 이것은 파일을 복사하려는 디렉토리입니다. 요구 사항에 따라 이 디렉터리 이름을 변경합니다.
#!/bin/bash find /Logfiles/ -maxdepth 1 -type f | #find all files located under folder Logfiles with maxdepth one. while read FILEDIR #Read all files line by line. do DIR="${FILEDIR%/*}" # Get the folder name its inside # echo $DIR FILE="${FILEDIR/*\/}" # Get the plain file name. # echo $FILE NEWFILE="${DIR}"_"${FILE}" # set new filename. # echo $NEWFILE echo -e "coping $FILE from $DIR in /tmp with name $NEWFILE \n" cp $DIR/$FILE /tmp/$NEWFILE #copy file from old location to new location with modified name. done
답변3
그리고pax
:
pax -'rws|/|_|' -- */u_ex150407.log target/dir
pax
POSIX에서 지정한 표준 파일 아카이버입니다. 불행하게도 – 이것이 필수이긴 하지만리눅스 표준 라이브러리그리고 이미 동일한 버전이 증가하고 있습니다. 어떤 이유로든 많은 배포판에서는 두 표준에서 요구하는 기본 설치로 패키지하지 않습니다. 매우 다재다능한 도구이기 때문에 이것이 안타까운 일이라고 생각합니다.
위에서 나는 ead 및 rite 모드 pax
로 들어가라고 말했습니다.-r
-w
(카피로 번역됨)그리고 출력 파일의 이름을 지정할 때 -s
기본적으로 표준 BRE 구문을 수행할 수 있습니다./
_
sed
(여기에서는 왼쪽의 텍스트 줄 바꿈이 허용되는 것을 제외하고), 그러나 이 경우에는 자세한 설명이 필요하지 않습니다.
어쨌든, 그게 전부입니다. 어떤 이유로 설치되어 있지 않다면 설치하여 사용해 보시기를 권장합니다 pax
.
답변4
간단한 POSIX 셸 답변:
#!/bin/sh
for i in */*.log
do mv "$i" "${i//\//_}"
done
*/*.log
동일한 이름과 일치하는 모든 파일이 이동 /
되고 _
.