CLI를 사용하여 날짜별로 파일을 다른 디렉토리로 이동 생성 날짜가 2012 년 또는

오래된 하드 드라이브의 사진을 정리하려고합니다. 를 실행하면 ls -l모든 파일의 생성 날짜가 2012 년 또는 그 이전임을 알 수 있습니다. 이상적으로는 자동으로 마운트되도록 설정되지 않은 컴퓨터의 두 번째 하드 드라이브로이 장치를 옮기고 싶습니다. 바람직하게는이 명령을 함께 연결하여 배치 로이 작업을 수행 할 수 있습니다. 지금까지 나는 ls -l | grep -i 2012제공 한 날짜에 2012 년 파일 만 뱉어 냈습니다 ls -l. 이제, 그 트릭은 cp모든 파일을 새 디렉토리로 가져 오는 것입니다. 각 파일을 복사해야하기 때문에 다음으로 어디로 가야할지 모르겠습니다. 다음 명령 세트는 무엇입니까?



답변

사용하지 마십시오 ls. 그러한 경우에는 사용하지 않는 것이 좋습니다. 또한 grep날짜에 따라 필터링하는 것은 좋은 생각이 아닙니다. 20122012 년에 파일 이름이 수정되지 않았더라도 파일 이름 자체에 문자열이 포함될 수 있습니다 .

find명령을 사용 하고 출력을 파이프 하십시오 .

find . -newermt 20120101 -not -newermt 20130101 -print0 | xargs -0 cp -t /your/target/directory 

여기,

-newermt 20120101  ==>  File's modified date should be newer than 01 Jan 2012
-not               ==>  reverses the following condition. Hence file should be older than 01 Jan 2013
-print0 and -0     ==>  Use this options so that the command doesn't fail when filenames contain spaces 

답변

오래된 디스크에 무시하고 싶은 최신 파일이 있다면 다음과 같이 할 것입니다.

  1. 내가 원하지 않는 파일과 원하는 파일을 분리하는 수정 날짜로 임시 마커 파일을 만듭니다.
  2. 마커 파일보다 오래된 파일을 새 위치로 복사

다음은 새로운에서 이전 디스크에서 디렉토리 계층 구조를 유지하려는 가정이 샘플 명령은, (있는 cpio유사한 복사 명령한다 tar또는 pax) :

touch -t 201201010000 /tmp/marker    # YYYYMMDDhhmm == Jan 1st, 2012
cd /path/to/old/disk
find . -type f \! -newer /tmp/marker -print0 | cpio -pmd0 /path/to/new/disk

답변

아마도이 문제는 귀하의 문제와 매우 동일하다고 생각합니다. 하위 디렉토리를 만들고 날짜별로 파일을 구성하십시오.

해당 문제의 첫 번째 답변을 기반으로이 새 스크립트를 작성합니다.

for x in *; do
  d=$(date -r "$x" +%Y)
  mkdir -p "/your/new/directory/$d"
  mv -- "$x" "/your/new/directory/$d/"
done
  1. 이 스크립트를 copy.sh이전 디렉토리에 이름이 지정된 파일 에 작성하십시오.

  2. /your/new/directory새 디렉토리 경로로 바꾸십시오.

  3. 이 파일을 실행 파일로 만드십시오. chmod +x copy.sh

  4. 그런 다음이 파일을 실행하십시오. ./copy.sh


답변

배치 작업에는 배치 도구를 사용해야합니다. 그렇게하려면 일반적으로 예를 들어 cp복사 된 각 파일에 대해 별도의 프로세스를 호출하는 것이 아니라 단일 스트림으로 모든 레코드를 읽거나 쓰는 것이 수반됩니다 .

여기에 이미 cpio작성된 답변이 있습니다. 이미 제공된 옵션 만 제공하면 내가 선택한 것입니다. 그러나이 cpio형식은 pax전성기부터 개선되어 표준화 된 아카이브 형식으로 접혔습니다 . 동일합니다 tar.

엄격하게 POSIX- pax는 파일 수정 시간을 기준으로 아카이브 멤버를 직접 필터링하는 옵션을 제공하지는 않지만 표준은 %T목록 모드 형식 수정자를 지정합니다 . 여전히, pax내가 아는 가장 일반적으로 사용 가능한 구현 ( mirabilos 가 유지 관리하는 BSD 버전) 은 이것을 직접 액세스 가능한 CLI 스위치로 확장합니다.

예를 들어 ./이전 ccyymmddHHMM에 마지막으로 수정 된 트리의 모든 파일 만 복사 하려면 /target/dir다음을 수행하십시오.

pax -rwT,201301010000 ./ /target/dir

하위 디렉토리로의 재귀를 피하려면 대신 다음을 수행하십시오.

pax -rwdT,201301010000 ./* /target/dir

자세한 내용은 man페이지를 참조하십시오 .