동기화를 유지해야 하는 파일이 많이 있습니다. 예를 들면 다음과 같습니다.
./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
) 그.
bash
GNU 도구 사용 :
(
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"