最後のファイルを除くすべてのファイルをどのように移動できますか?

最後のファイルを除くすべてのファイルをどのように移動できますか?

最後のnファイルを除くすべてのファイルをからにdir1移動する方法はdir2

現在は、時間をおおよその値に設定してこれを行いますn。私の場合はn=210分ごとです。

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:隠しファイルを含み、隠しディレクトリに入ります。
  • .:通常のファイルのみ(シンボリックリンク、ディレクトリなし...)、findsと同じです-type f
  • om:修正時間でソートします(最新順、例ls -t:)。
  • [3,-1]:3番目から最後まで

zmodload zsh/files(組み込み機能を得るためにaを発行することができますmvzargs引数リストが大きすぎます質問)。

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-zcuttail

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.txtdir2/file.txt

おすすめ記事