마지막 파일을 제외한 모든 파일을 어떻게 이동할 수 있나요?

마지막 파일을 제외한 모든 파일을 어떻게 이동할 수 있나요?

마지막 n파일을 제외한 모든 파일을 에서 으로 dir1이동 하는 방법은 무엇입니까 dir2?

현재는 시간을 대략적인 값으로 설정하여 이 작업을 수행합니다 n. 제 경우에는 n=210분마다입니다.

find /dir1/ -name '*.txt*' -mmin +10 -type f -exec mv "{}" /dir2/ \;

유사한 명령이 작동하지만 확실하지 않습니다. 어떻게 조정해야 하는지 확인할 수 있는 사람이 있습니까?

ls -1tr | head -n -2 | xargs -d '\n' mv -f --

답변1

그리고 zsh:

mv dir1/**/*.txt*(D.om[3,-1]) dir2/

dir1가장 최근에 수정된 2개의 파일을 제외한 일반 파일을 dir2.

  • **/: 모든 수준의 하위 디렉터리.
  • D: 숨겨진 파일을 포함하고 숨겨진 디렉토리에 들어갑니다.
  • .: 일반 파일만(심볼릭 링크, 디렉토리 없음...), finds 와 동일합니다 -type f.
  • om: 수정 시간을 기준으로 정렬합니다(최신순, 예: ls -t).
  • [3,-1]: 3번째부터 마지막까지만

zmodload zsh/files( 내장 기능을 얻기 위해 a를 발행할 수 있습니다 mv. 또는 zargs다음과 같은 경우인수 목록이 너무 큼질문).

POSIXly에서는 파일 이름, 파일 수 및 경로 길이에 대한 몇 가지 가정 없이는 이를 수행할 수 없습니다.

GNUly(최신 버전의 GNU 도구 사용 -z) 다음을 수행할 수 있습니다.

find dir1 -name '*.txt*' -type f -printf '%T@\t%p\0' |
  sort -rnz | tail -zn +3 | cut -zf2- | xargs -r0 mv -t dir2

GNU sort에는 수십 년 동안 / 옵션이 xargs있었지만 for 및 옵션이 추가된 것은 최근입니다. 이전 버전이 있는 경우 언제든지 다음을 수행할 수 있습니다.-z-0-zcuttail

find dir1 -type f -printf '%T@\t%p\0' | sort -rnz |
  tr '\n\0' '\0\n' |
  tail -n +3 | cut -f2- |
  tr '\n\0' '\0\n' | xargs -r0 mv -t dir2

이러한 솔루션은 하위 디렉터리를 포함하여 에서 파일을 반복적으로 검색하지만 dir1에는 없습니다 dir2. 즉, 예를 들어 a dir1/file.txt및 가 모두 있으면 둘 다 이동되어 하나가 다른 하나를 덮어쓰게 dir1/subdir/file.txt됩니다 .dir2/file.txt

답변2

날짜가 표시된 파일은 쉘 글로브 순서(예: *.txtbash)로 함께 수집되므로 배열을 사용할 수 있습니다(예: bash).

n=2 ## how many of each you want to keep
txtfiles=(*.txt)
auxfiles=(*.txt_aux)
totaltxt=${#txtfiles[@]}
totalaux=${#auxfiles[@]}
movetxt=$((totaltxt-n))
moveaux=$((totalaux-n))
echo mv "${txtfiles[@]:0:movetxt}" /dir/aux2/
echo mv "${auxfiles[@]:0:moveaux}" /dir/aux2/

echo올바르게 보이면 마지막 두 조각을 제거합니다.

답변3

더 간단한 방법:

mv `ls -tr sourcedir | head -n -2` destdir 

참고: 이는 디렉터리에 두 개 이상의 파일이 있다는 것을 알고 있다고 가정합니다. 확실하지 않은 경우 다음을 사용할 수 있습니다.ls | wc -l

관련 정보