最後の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
答え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
正しく表示されたら、最後の2つの部分を削除します。
答え3
より簡単な方法:
mv `ls -tr sourcedir | head -n -2` destdir
注:これは、ディレクトリに複数のファイルがあることを知っていると仮定します。わからない場合は、次のものを使用できます。ls | wc -l