다음과 같은 일일 로그가 포함된 폴더가 있습니다.
system-2013-01-01.log
system-2013-01-02.log
system-2013-01-03.log
system-2013-01-04.log
system-2013-01-05.log
system-2013-01-06.log
system-2013-01-07.log
system-2013-01-08.log
...
system-2013-01-31.log
2013-01-01부터 2013-01-15까지의 로그를 선택하고 복사하는 방법은 무엇입니까?
답변1
bash
지원하다버팀대 확장를 사용하면 명령에서 확장할 여러 값이나 범위를 지정할 수 있습니다. 예를 들어,
$ echo {1..5}
1 2 3 4 5
$ echo foo_{01..05}
foo_01 foo_02 foo_03 foo_04 foo_05
따라서 복사할 파일 범위를 쉽게 지정할 수 있습니다.
cp system-2013-01-{01..31}.log /some/destination/dir
이는 다음 bash
으로 확장됩니다.
cp system-2013-01-01.log system-2013-01-02.log system-2013-01-03.log ...
답변2
매일 파일이 있는 경우 다음에서 시퀀스 표현식을 사용할 수 있습니다.큰 괄호:
cp -p system-2013-01-{01..15}.log /elsewhere
일일 파일이 없으면 문자를 사용할 수 있습니다무늬.
cp -p system-2013-01-0[1-9].log system-2013-01-1[0-5].log /elsewhere
두 범위 중 하나에 일치하는 파일이 없으면 패턴은 확장되지 않은 상태로 유지됩니다. 설정빈 공이를 방지하기 위한 옵션(bash 전용)입니다( shopt nullglob
).
Zsh는 숫자 범위를 통해 이를 더 쉽게 만듭니다.<start-stop>
글로벌 모드.
cp -p system-2013-01-<1-15>.log /elsewhere
zsh가 필요하지 않고 더 복잡한 경우에 맞게 확장되는 또 다른 방법은 find
파일 목록을 생성하는 것입니다. 불일치에 대해 걱정할 필요가 없습니다. cp
모든 일치에 대해 수행됩니다.
find . \( -name 'system-2013-01-0[1-9].log' -o -name 'system-2013-01-1[0-5].log' \) -exec cp -p {} /elsewhere \;
하위 디렉터리로의 재귀를 방지하려면 -type d -prune -o
뒤에 추가하세요 .find .