同期を維持する必要があるファイルがたくさんあります。たとえば、次のようになります。
./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"