web-dev-qa-db-ja.com

lsで相対パスを取得するにはどうすればよいですか?

最後にダウンロードした2つのファイルを移動するには、次のようにします。

mv ` ls -rt ~/Downloads/ | tail -2 ` .

残念ながら、lsはファイル名のみを提供します。上記のコードをどのように適応できますか?

(誰かが指摘する前に、lsの出力をパイプ処理する際の問題を認識しています。問題のファイル名がわかっている場合にのみ使用します。)

8
Tim

さて、lsをあきらめない場合は、少なくともxargsの方が適している場合は特に、すべてにバックティックを使用する習慣から抜け出してください。

ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .
10
geocar

ここで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 % .
8
Gilles Quenot

ls -rt ~/Downloads/*ではなくls -rt ~/Downloads/を使用してください。 ls -rt ~/Downloads/*では、引数文字列は最初にシェルによって展開されます(これは filename globbing と呼ばれます)。したがって、ls -rtコマンドの引数としてパスのリストを取得し、lsのオプションで指定した方法でソートします。対照的に、コマンドls -rt ~/Downloads/は、ディレクトリ~/Downloads/の内容を読み取ります。これは、ディレクトリパスのないファイルのリストです。

3
miracle173

Zshの場合:

mv ~/Downloads/*(.om[1,2]) .

(...)部分はグロビング修飾子と呼ばれ、zshのキラー機能の1つです。各修飾子(通常は1文字)を使用すると、ファイルの属性(タイプ、サイズ、時間など)に基づいて一致するエントリをフィルタリングしたり、展開される順序を変更したり、展開方法を変更したりできます。

上記には、次のものがあります。

  • .(ドット):通常のファイルのみを選択します(ディレクトリ、シンボリックリンクではありません...)
  • omoリストをm odification時間で並べ替えます。
  • [1,2]:最初の2つのエントリのみを選択します。

また、一致しない場合(他のシェルが誤って間違ったファイル/ディレクトリを移動する可能性がある場合)、コマンドは失敗することにも注意してください。

2