Files
如何移動除最後一個文件之外的所有內容?
我怎樣才能將除最後一個
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 --
與
zsh
:mv dir1/**/*.txt*(D.om[3,-1]) dir2/
會將
dir1
除最近修改的 2 個文件之外的正常文件移至dir2
.
**/
:任何級別的子目錄。D
: 包括隱藏文件並進入隱藏目錄。.
: 僅正常文件(無符號連結、目錄…),相當於find
’s-type f
.om
: 按修改時間排序(最近的第一個喜歡用ls -t
)。[3,-1]
: 只從第三個到最後一個(如果遇到arg 列表太大的問題,您可以發出 a
zmodload zsh/files
來獲取內置函式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
. 這意味著,例如,如果同時存在 adir1/file.txt
和dir1/subdir/file.txt
,它們最終都會被移動到dir2/file.txt
,其中一個會覆蓋另一個。