Files

如何移動除最後一個文件之外的所有內容?

  • November 30, 2017

我怎樣才能將除最後一個n文件之外的所有內容從移動dir1dir2?。

我目前這樣做,將時間設置為 的近似值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 列表太大的問題,您可以發出 azmodload 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

雖然 GNUsort和/選項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.txtdir1/subdir/file.txt,它們最終都會被移動到dir2/file.txt,其中一個會覆蓋另一個。

引用自:https://unix.stackexchange.com/questions/378266