15000 개의 zip 파일이있는 디렉토리가 있습니다. 압축을 풀 때 다음 형식의 파일을 포함하는 모든 파일의 이름을 바꾸고 싶습니다.
YYYYMMDD_IPC.csv
어디 YYYYMMDD
에서 날짜 가 발생하지만이 문제의 목적 상 정확히 8 자리의 문자열입니다. 그런 다음 zip 파일 자체의 이름을
YYYYMMDD_IPC.zip.
다음 명령 줄까지 얻었지만 YYYYMMDD
zip 파일의 이름을 바꾸는 데 사용할 포함 된 파일에서 캡처하는 방법을 모르겠습니다 .
find . -iname '*.zip' | while read file; do unzip -l "$file" | grep -q -P '\d{8}_IPC.csv' && echo $file; done 2>&-
읽어 주셔서 감사합니다.
find . -iname '*.zip' -exec bash -c 'name=$(unzip -qql "$1" '*_IPC.csv' | grep -oE '[[:digit:]]{8}_IPC.csv' | head -n1); [ "$name" ] && mv "$1" "${name%csv}zip"' none {} ';'
이 명령의 형식은 다음과 같습니다.
find . -iname '*.zip' -exec bash -c '...' none {} ';'
현재 디렉토리와 그 아래의 모든 하위 디렉토리에서 .zip 파일을 검색합니다. 찾은 각 파일에 대해 작은 따옴표로 묶인 bash 명령이 실행됩니다. 발견 된 파일의 이름은 $1
bash 명령의 인수 1에서 제공됩니다 . 우리의 경우 bash 명령은 두 부분으로 구성됩니다. 첫 번째는 csv 파일 이름을 추출하여 bash 변수에 저장합니다 name
.
name=$(unzip -qql "$1" '*_IPC.csv' | grep -oE '[[:digit:]]{8}_IPC.csv' | head -n1)
위는 명령 대체를 사용합니다 . 내부 명령 $(...)
이 실행되고 표준 출력이 캡처됩니다. 이 경우 변수에 할당합니다 name
. 이 명령 unzip -qql "$1" '*_IPC.csv'
은 glob과 일치하는 zip 파일에서 모든 파일 이름을 자동으로 추출합니다 *_IPC.csv
. glob으로 제한 할 필요는 없지만 *_IPC.csv
zip 파일에 많은 파일이있는 경우 속도가 빨라질 수 있습니다.
grep 명령은 rep -oE '[[:digit:]]{8}_IPC.csv'
추가로 8 자리로 시작하는 이름 만 선택합니다. 이 head -n1
명령은 발견 된 첫 번째 이름을 선택합니다. 그러한 이름이 하나만 있다면 head -n1
필요하지 않을 것입니다. 그러나 유지 head
하면 첫 번째 일치 후 파이프 라인이 종료되므로 속도를 높일 수 있습니다.
두 번째 부분에서는 비어 있지 않은 항목을 가져 오는 데 성공 name
했는지 테스트 하고, 그렇다면 zip 파일의 이름을 바꿉니다.
[ "$name" ] && mv "$1" "${name%csv}zip"
위는 접미사 제거 를 사용하여 csv 파일 이름을 zip 파일 이름으로 변경합니다. 접미사를 제거한 후 ${name%csv}
반환 $name
됩니다 csv
. ${name%csv}zip
zip 접미사를 추가합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다