마지막 n
파일을 제외한 모든 파일을 에서 으로 dir1
이동 하는 방법은 무엇입니까 dir2
?
현재는 시간을 대략적인 값으로 설정하여 이 작업을 수행합니다 n
. 제 경우에는 n=2
10분마다입니다.
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
: 숨겨진 파일을 포함하고 숨겨진 디렉토리에 들어갑니다..
: 일반 파일만(심볼릭 링크, 디렉토리 없음...),find
s 와 동일합니다-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
-z
cut
tail
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
날짜가 표시된 파일은 쉘 글로브 순서(예: *.txt
bash)로 함께 수집되므로 배열을 사용할 수 있습니다(예: 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