最後の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
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
。つまり、たとえば、aと両方dir1/file.txt
がある場合、両方が移動され、一方が他方を上書きしますdir1/subdir/file.txt
。dir2/file.txt