最後にダウンロードした2つのファイルを移動するには、次のことを行いたいと思います。
mv ` ls -rt ~/Downloads/ | tail -2 ` .
残念ながら、ls
ファイル名だけが表示されます。上記のコードをどのように修正できますか?
(誰かが指摘する前に、私はパイプ出力の問題を知っていますls
。問題のファイル名を知っている場合にのみ使用します。)
答え1
さて、それをあきらめない場合は、ls
少なくともすべてにバックティックを使用する習慣を捨てるようにしてください。特にxargs
適切な場合はさらにそうです。
ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .
答え2
そこからGNUを使用できますfind
。
mv $(find ~/Download -mindepth 1 -maxdepth 1 -printf '%Ts %p\n' | sort -n | cut -d ' ' -f2- | tail -n 2) .
オプションfind -printf
:
%Ts
時間を次のように表示します。連帯%p
ファイルパス
バラよりman find | less +/'^ *-printf'
編集する
ファイル名でスペースを処理する必要がある場合は、他の解決策をお勧めします。
find -maxdepth 1 -printf '%Ts %p\n' |
sort -n |
cut -d ' ' -f2- |
tail -n 2 |
xargs -i% mv % .
答え3
.In引数ls -rt ~/Downloads/*
の代わりに使用すると、文字列は最初にシェルによって拡張されます(これを呼び出します)。ls -rt ~/Downloads/
ls -rt ~/Downloads/*
ファイル名ワイルドカード)。したがって、ls -rt
コマンドの引数でパスリストを取得し、コマンドはoptionsで指定した方法でパスリストをソートしますls
。代わりに、このコマンドはls -rt ~/Downloads/
ディレクトリの内容を読み取ります~/Downloads/
。ディレクトリパスを含まないファイルのリスト。
答え4
zshを使う:
mv ~/Downloads/*(.om[1,2]) .
この(...)
部分を言いますワイルドカード修飾子、トランプカードの一つですzsh
。各修飾子(通常は単一文字)を使用して、ファイル属性(タイプ、サイズ、時間...)に基づいて一致する項目をフィルタリングし、拡張順序を変更したり、拡張方法を変更したりできます。
上記には次のものがあります。
.
(ドット):一般ファイルのみを選択します(ディレクトリ、シンボリックリンクを除く...)。om
:ああリストの並べ替え米酸化時間。[1,2]
:最初の2つの項目のみを選択します。
また、一致するものがないとコマンドが失敗することに注意してください(他のシェルが誤って間違ったファイル/ディレクトリを移動する可能性があります)。