두 디렉터리 간의 파일 이름 차이점 찾기(파일 확장자 무시)

두 디렉터리 간의 파일 이름 차이점 찾기(파일 확장자 무시)

동기화를 유지해야 하는 파일이 많이 있습니다. 예를 들면 다음과 같습니다.

./regular/*.txt
./compressed/*.txt.bz2

./regular에 파일을 업로드할 때 아직 압축되지 않은 파일을 주기적으로 확인하여 bzip2로 압축하는 스크립트를 만들고 싶습니다.

내 생각에는 마치...

ls ./regular/*.txt as A
ls ./compressed/*.txt* as B

for each in A as file
    if B does not contain 'file' as match
        bzip2 compress and copy 'file' to ./compressed/

이를 수행할 수 있는 프로그램이 있습니까? 아니면 누군가 coreutils/bash에서 이런 종류의 작업이 수행되는 방식을 보여줄 수 있습니까?

답변1

zsh대신 사용하십시오 bash:

regular=(regular/*.txt(N:t))
compressed=(compressed/*.txt.bz2(N:t:r))
print -r Only in regular: ${regular:|compressed}
print -r Only in compressed: ${compressed:|regular}

그러면 다음과 같이 할 수 있습니다:

for f (${regular:|compressed}) bzip2 -c regular/$f > compressed/$f.bz2

${A:|B}이는 배열 빼기 연산자(요소로 확장)를 사용하여 수행됩니다.A 술집(제외) B) 그.

bashGNU 도구 사용 :

(
  export LC_ALL=C
  shopt -s nullglob
  comm -z23 <(cd regular && set -- *.txt && (($#)) && printf '%s\0' "$@") \
            <(cd compressed && set -- *.txt.bz2 && (($#)) &&
               printf '%s\0' "${@%.bz2}")
) |
  while IFS= read -rd '' f; do
    bzip2 -c "regular/$f" > "compressed/$f.bz2"
  done

그런 다음 빼기는 명령에 의해 수행됩니다 comm. 여기에서 NUL 구분 기호를 사용하면 zsh 솔루션에서와 마찬가지로 임의의 파일 이름을 처리할 수 있습니다.

답변2

끝에 "/" 없이 디렉터리 경로를 변경하면 됩니다. 도움이 되기를 바랍니다!

#!/bin/bash

path_input=/tmp/regular
path_compressed=/tmp/compressed
compressed_ext='.bz2'

echo "Starting backup..."
#List files and check if they are compressed
for file in `ls -1 $path_input/*.txt`; do

    #Compressed file search
    search_compressed=`sed "s;"$path_input";"$path_compressed";g" <<< $file$compressed_ext`

    if [[ ! -f $search_compressed ]]
        #Compress file
        then
            echo "Compressing $file"
            bzip2 --keep --force "$file"
            mv -f "$file$compressed_ext" "$path_compressed"
    fi
done

echo "Done"

관련 정보