web-dev-qa-db-ja.com

コマンドライン引数で最近変更されたファイルを参照することは可能ですか?

私は頻繁にPDFファイル名が凶悪な数値のファイルをブラウザからダウンロードします。これらは自動的に~/Downloadsに入ります。理想的には、これらのファイルを次のコマンドで開くことができるようにしたいだけです。

evince "the most recently modified file"

ファイル名を見つけるために~/Downloadsを開く必要はありません。

bashで「最近変更されたファイル」を指定する簡単な方法はありますか?

注:これを行うのは可能であることはわかっていますが、理想的には、名前を確認するためにls -t'ing ~/Downloadsよりも簡単な解決策を探しています。

7
DQdlM
evince "$(ls -t | head -n1)"

スペース、タブ、および(私が信じる)印刷スペシャルを処理しますが、ファイル名に改行が含まれている場合、および場合によっては他の非印刷文字で壊れます。

10
Kevin

これは、ls -tよりも正確で堅牢なアプローチですが、さらに複雑になります。

セットアップ

$PATHに短いシェルスクリプト(以下のコード)を追加します。 ~/binはそのための良い場所です。

確認することを忘れないでください

  • スクリプトは実行可能ですchmod +x ~/bin/script_name
  • ~/binはあなたの$PATHにあります

使用法

~/Download内の最新のファイルで実行するコマンドをlast_downloadに渡します。

スクリプトにlast_downloadという名前を付けたと仮定します

  • last_download(引数なし):~/Downloads内の最新のファイルに対してデフォルトコマンドであるevinceを実行します
  • last_download mplayer~/Downloadsの最新ファイルでmplayerを実行します
  • last_download cp -t ~/Desktop~/Downloadsの最新ファイルを~/Desktopにコピーします

コード

#!/bin/sh
# Usage: last_download [cmd [options]...]

newest=
dir=~/Downloads

# default command
if [ $# -eq 0 ]; then
        set -- evince;
fi

# find newest file
for f in "$dir"/*; do
        if [ -z "$newest" ] || [ "$f" -nt "$newest" ]; then
                newest="$f"
        fi
done
if ! [ -e "$newest" ]; then
        exit 1
fi

# run command on newest file
"$@" "$newest"

注:スクリプトは~/Downloadのみを検索しますが、ディレクトリをサポートするように一般化することは難しくありません。その場合、名前の変更も保証されます。

4
jw013
exec zsh
evince ~/Downloads/*.pdf(om[1])

または、zshに切り替えたくない場合

cd ~/Downloads
zsh -c 'evince ./*.pdf(om[1])'

括弧内のビットは glob qualifiers です。 omは、名前ではなく変更時刻を使用するようにグロブの順序を変更します(最新のものが最初)。 [1]は、最初の一致のみを使用することを意味します。

詳細については、 「zshでglobをフィルタリングする方法」に対するこの回答 を参照してください。

変更された find_date_sorted を使用できます:

last_download() {
    while IFS= read -r -d '' -u 9
    do
        cut -d ' ' -f 3- <<< "$REPLY"
        break
    done 9< <(find ~/Downloads -maxdepth 1 -type f -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\0' | sort -rz)
}

どのファイル名でも機能します。ファイルを開くには:

evince "$(last_download)"
3
l0b0

いいえ。たとえあったとしても、一部のシステムログが通常は最新の更新ファイルではないことを確認できませんでした。

ケビンの答え(彼は私をそれに打ち負かした)は、あなたが避けたいだけならうまくいきます手動で開く~/Downloads

0
Useless