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

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

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

답변1

사용하지 마세요 ls. 그러한 상황에서는 사용하지 않는 것이 좋습니다. 또한 grep날짜 기반 필터링을 사용하는 것은 좋은 생각이 아닙니다. 2012년에 수정되지 않았더라도 파일 이름 자체에 2012문자열이 포함될 수 있습니다.

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 

답변2

이전 디스크의 새 파일을 무시하려면 다음과 같이 하세요.

  1. 내가 원하는 파일과 원하지 않는 파일을 분리하기 위해 수정된 날짜가 포함된 임시 태그 파일을 만듭니다.
  2. 표시된 파일보다 오래된 파일을 새 위치로 복사합니다.

다음은 새 디스크에 있는 이전 디스크의 디렉터리 계층 구조를 유지한다고 가정하는 명령의 예입니다( 또는 cpio와 유사한 복사 명령입니다 ).tarpax

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

답변3

내 생각에 이 문제는 귀하의 문제와 매우 유사할 수 있습니다. 다음을 살펴볼 수도 있습니다.하위 디렉터리를 만들고 날짜별로 파일을 정리하세요.

나는 이 질문에 대한 첫 번째 대답을 바탕으로 이 새로운 스크립트를 작성했습니다.

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

답변4

일괄 작업에는 일괄 처리 도구를 사용해야 할 수도 있습니다. 이를 수행하려면 일반적으로 cp복사된 각 파일에 대해 별도의 프로세스를 호출하는 대신 단일 스트림의 모든 레코드를 읽고 써야 합니다 .

여기에 답변이 작성되었습니다 cpio. 아마도 귀하에게 제공된 옵션을 고려하여 선택할 것입니다. 그러나 전성기 이후에는 cpio형식이 개선되어 표준화된 pax아카이브 형식으로 통합되었습니다. 도 이렇습니다 tar.

엄격한 POSIX - pax표준에서는 %T목록 모드 형식 수정자를 지정하지만 파일 수정 시간을 기준으로 아카이브 구성원을 직접 필터링하는 옵션을 제공할 가능성은 거의 없습니다. 그럼에도 불구하고, pax내가 아는 한, 가장 일반적으로 사용되는 구현은 다음에서 관리하는 BSD 버전입니다.미라빌로스- 실제로 이를 직접 액세스 가능한 CLI 스위치로 확장했습니다.

예를 들어, ./Last Modified 에 루트가 있는 트리의 모든 파일 만 복사하려면 다음을 수행할 수 있습니다 ccyymmddHHMM./target/dir

pax -rwT,201301010000 ./ /target/dir

하위 디렉터리로 반복되는 것을 방지하려면 다음을 수행할 수 있습니다.

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

보다man자세히 알아보려면 페이지를 방문하세요.

관련 정보