bash는 while 루프에 와일드 카드가있는 아카이브 된 파일 목록 찾기


2

다른 하위 디렉토리에 수천 개의 압축 된 텍스트 파일이 있으며 몇 년 전에 프로젝트의 입력으로 이러한 파일의 하위 집합을 사용했습니다. 당시에는 실제로 한 디렉토리에서 사용한 파일의 압축이 풀린 사본이 있었지만이를 삭제하고 압축 해제 된 파일 목록 만 해당 폴더에 보관했습니다.

이것은 내 초기 아이디어였습니다 LIST. 파일 목록입니다. PARENTDIR모든 파일이 다양한 하위 디렉토리에있는 최상위 디렉토리입니다. 아이디어는 모든 하위 디렉토리에서 모든 아카이브를 찾아서 압축합니다.NEWDIR

#!/usr/bin/env bash    

LIST="listfile.txt"
PARENTDIR="/home/user/old/project"
NEWDIR="/home/user/old/project/2016"

while read line;
do
    ARCHIVE="$(find $PARENTDIR -name "$line*")"
    gunzip --stdout $ARCHIVE >$NEWDIR/$line
done <$LIST

find 명령이 올바르게 보이지 않는 것 같습니다. 변수없이 작동하지만 명령 대체를 호출하지 않아도 명령 행을 호출하지 않아도 작동합니다. 따옴표와 와일드 카드의 조합이 정확하지 않지만 올바르게 얻을 수 없으며 변수 확장이 도움이되지 않으며 붙어 있다고 생각합니다 ...


echo "$ARCHIVE"발생한 부분을 ​​확인하려면 디버깅 할 부분 set +전후에 추가 하십시오 set - . 사용하려는 공간이 " $variable"있는 경우 ... 키와 호환되는 둘 이상의 아카이브를 찾은 경우 어떻게됩니까? 더 나은find... -exec gzip {} ;
— Hastur

제안에 감사드립니다 echo "$ARCHIVE", 빈 줄을 출력하고 echo $line내가 기대하는 것을 보여줍니다. 나는 포함 set +되어 set -있지만 아무것도 일어나지 않는 것 같았지만
— Carambakaracho

@Hastur, 당신 말이 맞아, 내 테스트에 따르면 수천 개의 사본이 있지만 전부는 아닙니다. 원칙적으로 첫 번째 텍스트 파일을 두 번째 텍스트 파일로 덮어 쓸 수 있습니다 find... -exec gzip {} ;. 아카이브를 두 번 압축 해제하면됩니까?
— Carambakaracho

답변:


1

-exec옵션을 사용하려고 생각 find했지만 gunzip명령에 사용 된 리디렉션 연산자로 인해 작동하지 않습니다 . 한 가지 해결책은 다음 두 단계로 작업을 수행하는 것입니다.

1. 아카이브를 $NEWDIR다음 위치에 복사하십시오 .

    while read line
    do
        find "$PARENTDIR" -name "$line*" -exec cp -v {} "$NEWDIR" \;
    done < "$LIST"

이것은 GNU find뿐만 아니라 POSIX 호환 버전에서도 작동 find합니다.

비슷한 이름의 파일을 덮어 쓰지 마십시오

중복 된 파일 이름이있는 경우 파일 이름을 덮어 씁니다 $NEWDIR. 파일을 덮어 쓰지 않으려면 안에 디렉토리 트리를 다시 만들어야합니다 $NEWDIR. 이 작업은 사용하여 수행 할 수 있습니다 install에서 명령 의 GNU로 coreutils 만들어 모든 유사한 경로의 일부를 mkdir -p.

    cd "$NEWDIR"
    while read line
    do
        find . -name "$line*" -exec install -D {} $NEWDIR/{} \;
    done < "$LIST"
    cd -

2. 복사 된 파일을 압축 해제하십시오.

    find "$NEWDIR" -exec gunzip {} \;

감사합니다. 초기 문제에 대한 실제 해결책은 디렉토리를 변경하는 것이었지만 제안없이 시도하지는 않았습니다. 나는 내부에서 스크립트를 실행했고 $NEWDIR이것이 절대 경로가 주어져야한다고 생각했다. $PARENTDIR작품 을 찾기 위해 움직일 때 , 나는 정말로 이해하지 못한다. -exec cp물론 그 당시에는 사본을 만들었 기 때문에이 진술을 사용했습니다 .
— Carambakaracho

1
install명령 주셔서 감사합니다 , 나는 이것을 몰랐다! 이 경우 덮어 쓰기를 수락 할 수 있지만 중요하지는 않지만 install나중에 사용할 수 있도록 명령을 염두에 두겠습니다.
— Carambakaracho 2016 년

@Carambakaracho 시스템에서 설정을 다시 만들려고했는데 디렉토리를로 변경할 필요가 없었습니다 $PARENTDIR. 정보를 디버깅하지 않으면 왜해야하는지 말하기 어렵습니다. BTW, 비슷한 이름의 파일을 덮어 쓰지 않는 방법을 포함하도록 답변을 편집했습니다.
— Anthony Geoghegan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.