Server & OS/Unix & Linux
2010/05/25 17:19
특정 날짜 이후의 파일만 압축하는 법 」
|
tar -cvzf filename.tgz --newer-mtime 2004-10-31 *<앤터> ---> 2004년 10월 31일 이후의 날짜를 갖는 모든 파일을 압축 (※ 파일 날짜가 2004년 10월 31인 파일은 압축되지 않는다. 11월 1일 것부터 압축된다.) 계정의 이미지 파일을 월별로 분류할 필요가 있어서, cp명령(파일을 복사하는 명령)으로 특정 날짜 이전/이후의 파일을 복사하는 방법이 있을까 해서 찾아봤는데 $ man cp<앤터> 아쉽게도 그런 옵션은 없더군요. 그런데 순간 tar 명령이 생각났습니다. tar(담배에 들어있는 타르가 아니라, tape archive의 약자임) 명령은 파일을 묶어서 보관하는 명령이죠. 압축옵션(-z)을 주면 대상 파일을 묶은 다음 gzip으로 압축까지 하기 때문에, 쉽게 생각해서 tar는 파일을 압축하는 명령이라고 봐도 크게 틀리지는 않습니다. 아뭏든 tar 명령에서 '특정 날짜(시각) 이전/이후의 파일만' 묶는(혹은 압축하는) 옵션이 있는지를 찾아봤습니다. 결과는? 절반의 성공이었습니다. 특정 날짜 '이전'의 파일만 압축하는 옵션은 없지만, 다행이 특정 날짜 '이후'의 파일만 압축하는 옵션은 있더군요. $ man tar<앤터> NAME *파란색 강조는 제가 했습니다.tar - The GNU version of the tar archiving utility SYNOPSIS tar [ - ] A --catenate --concatenate | c --create | d --diff --compare | r --append | t --list | u --update | x -extract --get [ --atime-preserve ] [ -b, --block-size N ] [ -B, --read-full-blocks ] [ -C, --directory DIR ] [ --checkpoint ] [ -f, --file [HOSTNAME:]F ] [ --force-local ] [ -F, --info-script F --new-volume-script F ] [ -G, --incremental ] [ -g, --listed-incremental F ] [ -h, --dereference ] [ -i, --ignore-zeros ] [ -j, -I, --bzip ] [ --ignore-failed-read ] [ -k, --keep-old-files ] [ -K, --start- ing-file F ] [ -l, --one-file-system ] [ -L, --tape-length N ] [ -m, --modification-time ] [ -M, --multi- volume ] [ -N, --after-date DATE, --newer DATE ] [ -o, --old-archive, --portability ] [ -O, --to-stdout ] [ -p, --same-permissions, --preserve-permissions ] [ -P, --absolute-paths ] [ --preserve ] [ -R, --record-number ] [ --remove-files ] [ -s, --same-order, --preserve-order ] [ --same-owner ] [ -S, --sparse ] [ -T, --files-from=F ] [ --null ] [ --totals ] [ -v, --verbose ] [ -V, --label NAME ] [ --version ] [ -w, --interactive, --confirmation ] [ -W, --verify ] [ --exclude FILE ] [ -X, --exclude-from FILE ] [ -Z, --compress, --uncompress ] [ -z, --gzip, --ungzip ] [ --use-compress- program PROG ] [ --block-compress ] [ -[0-7][lmh] ] filename1 [ filename2, ... filenameN ] directory1 [ directory2, ...directoryN ] -N, --after-date DATE, --newer DATE only store files newer than DATE 처음에는 이 옵션을 쓰면 지정한 날짜 이후의 파일만 압축되는 건 줄 알았습니다. 그런데 해 보니까 그게 아니라 전체 파일이 다 압축이 되더군요. 그래서 인터넷에서 -N (--after-date, --newer) 옵션에 대한 자세한 정보를 찾아 보았습니다. 첫 번째 문서에 -N (--after-date, --newer) 옵션에 대한 설명이 나와 있습니다. 거길 보면 --newer-mtime이라는 옵션이 또 있다고 설명하고 있지요. inode 어쩌고 나와 있는데, 저는 리눅스 파일 시스템 구조가 어떠한지를 모릅니다. 그래서 뭔 말인지는 정확히 이해하지 못했지만, --newer-mtime 옵션을 주어서 압축해 보았습니다. $ tar -cvzf filename.tgz --newer-mtime 2004-10-31 *<앤터> 결과는? 성공했습니다. 정확히는 모르겠지만, 아마도 -N 옵션은 파일이 '실제로' 만들어진 시각을 기준으로 삼고, --newer-mtime 옵션은 ls -alF 했을 때 표시되는 시각을 기준으로 삼는 것 같습니다. 둘이 같을 것 같지만 실제로는 그렇지 않을 수 있습니다. 이를테면 계정 이전을 위해서 파일을 백업한 뒤 새 계정에 올리고 압축을 풀었을 때, ls 명령에 의해 표시되는 날짜는 이전 계정에 있던 파일 날짜 그대로이지만, 파일이 실제로 생성된 것은 압축을 풀었을 시점이죠. 특정 날짜 -가령 2005년 1월 1일- '이후'라는 것이, 1월 1일도 포함되는 것인지 아니면 1월 2일부터만 해당되는 것인지 설명만으로는 명확하지가 않아서 계정에 0바이트짜리 파일을 하나 만들고 테스트 해 보았습니다. 결과는? '지정한 날짜 자체는 포함되지 않는다'는 것이었습니다. 그래서 이를테면 2004년 11월 1일부터 오늘까지의 모든 파일을 압축하고자 한다면, 날짜를 지정할 때 '2004-11-01'이 아닌 '2004-10-31'로 지정해야 한다는 것을 알게 되었습니다. |
