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.