파일 이름 탐색, 복사 및 변환

파일 이름 탐색, 복사 및 변환

내 문제: 이름은 같지만 하위 디렉토리에 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

다음 스크립트를 사용하여 파일을 한 위치에서 다른 위치로 복사하고 이름을 수정할 수 있습니다.

참고: 다음 스크립트에서는 두 개의 값을 하드코딩했습니다.

  1. /로그 파일/:- 로그 파일 이름을 파일을 복사해야 하는 유효한 폴더 이름으로 변경합니다.

  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

paxPOSIX에서 지정한 표준 파일 아카이버입니다. 불행하게도 – 이것이 필수이긴 하지만리눅스 표준 라이브러리그리고 이미 동일한 버전이 증가하고 있습니다. 어떤 이유로든 많은 배포판에서는 두 표준에서 요구하는 기본 설치로 패키지하지 않습니다. 매우 다재다능한 도구이기 때문에 이것이 안타까운 일이라고 생각합니다.

위에서 나는 ead 및 rite 모드 pax로 들어가라고 말했습니다.-r-w(카피로 번역됨)그리고 출력 파일의 이름을 지정할 때 -s기본적으로 표준 BRE 구문을 수행할 수 있습니다./_sed(여기에서는 왼쪽의 텍스트 줄 바꿈이 허용되는 것을 제외하고), 그러나 이 경우에는 자세한 설명이 필요하지 않습니다.

어쨌든, 그게 전부입니다. 어떤 이유로 설치되어 있지 않다면 설치하여 사용해 보시기를 권장합니다 pax.

답변4

간단한 POSIX 셸 답변:

#!/bin/sh
for i in */*.log
do mv "$i" "${i//\//_}"
done

*/*.log동일한 이름과 일치하는 모든 파일이 이동 /되고 _.

관련 정보