CLI를 사용하여 날짜별로 파일을 다른 디렉토리로 이동


9

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

답변:


13

사용하지 마십시오 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
`-exec mv {} / your / target / directory \; ' '-print 0 대신 | xargs -0 cp -t / your / target / directory '는 이름의 공백 문제와 마찬가지로 잘 작동합니까? (또한, 영업 이익은 싶었다 이동 하지 복사 )
하겐 폰 Eitzen

^^ 네. 둘 다 같은 목표를 달성합니다.
shivams

4

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

  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

2

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

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

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


1
당신은 스크립트가 움직이지 않도록, 일부 예외 처리를 추가 할 수 있습니다 자신을2015디렉토리.
G-Man, '

1

배치 작업에는 배치 도구를 사용해야합니다. 그렇게하려면 일반적으로 예를 들어 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페이지를 참조하십시오 .


내가 정말 배워야한다고 생각 pax하지만, tar그리고 cpio아직도 나를 잘 서있다. +1
roaima

@roaima-엄밀히 말하면 실제 pax아카이브 형식 ( ustar 형식 의 확장 ) 이 있지만 POSIX 지정 pax 유틸리티 는 cpio, pax 및 ustar 형식을 읽고 씁니다. 세 가지 아카이브 유형 모두는 주로 파일의 실제 데이터와 함께 많은 파일의 메타 데이터를 단일 스트림으로 인코딩하는 다른 방법에 불과하기 때문에 실제로 그렇게 많은 것은 아닙니다. 나는 한 번 썼다 shitar- 대부분 -을위한 쉘 스크립트의 몇 줄이었다 dd- tarPOSIX의 사양에 따라 즉시 블록의 devs을 보내고.
mikeserv

나는 당신의 연결된 스크립트를 좋아합니다; 이상하게도 2 개월 전에 정확히 같은 목적으로 매우 유용했을 것입니다. 오 잘 나는 심지어 사용을 중지하려고 할 수도 있습니다 cpio -H ustar...
roaima
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.