最後にダウンロードした2つのファイルを移動するには、次のようにします。
mv ` ls -rt ~/Downloads/ | tail -2 ` .
残念ながら、ls
はファイル名のみを提供します。上記のコードをどのように適応できますか?
(誰かが指摘する前に、ls
の出力をパイプ処理する際の問題を認識しています。問題のファイル名がわかっている場合にのみ使用します。)
さて、ls
をあきらめない場合は、少なくともxargs
の方が適している場合は特に、すべてにバックティックを使用する習慣から抜け出してください。
ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .
ここでGNU find
を使用できます:
mv $(find ~/Download -mindepth 1 -maxdepth 1 -printf '%Ts %p\n' | sort -n | cut -d ' ' -f2- | tail -n 2) .
find -printf
オプション:
%Ts
は、時刻をEpochとして表示します%p
ファイルパス見る man find | less +/'^ *-printf'
編集
ファイル名のスペースを処理する必要がある場合は、これを別の解決策としてお勧めします。
find -maxdepth 1 -printf '%Ts %p\n' |
sort -n |
cut -d ' ' -f2- |
tail -n 2 |
xargs -i% mv % .
ls -rt ~/Downloads/*
ではなくls -rt ~/Downloads/
を使用してください。 ls -rt ~/Downloads/*
では、引数文字列は最初にシェルによって展開されます(これは filename globbing と呼ばれます)。したがって、ls -rt
コマンドの引数としてパスのリストを取得し、ls
のオプションで指定した方法でソートします。対照的に、コマンドls -rt ~/Downloads/
は、ディレクトリ~/Downloads/
の内容を読み取ります。これは、ディレクトリパスのないファイルのリストです。
Zshの場合:
mv ~/Downloads/*(.om[1,2]) .
(...)
部分はグロビング修飾子と呼ばれ、zsh
のキラー機能の1つです。各修飾子(通常は1文字)を使用すると、ファイルの属性(タイプ、サイズ、時間など)に基づいて一致するエントリをフィルタリングしたり、展開される順序を変更したり、展開方法を変更したりできます。
上記には、次のものがあります。
.
(ドット):通常のファイルのみを選択します(ディレクトリ、シンボリックリンクではありません...)om
:oリストをm odification時間で並べ替えます。[1,2]
:最初の2つのエントリのみを選択します。また、一致しない場合(他のシェルが誤って間違ったファイル/ディレクトリを移動する可能性がある場合)、コマンドは失敗することにも注意してください。