私は頻繁にPDFファイル名が凶悪な数値のファイルをブラウザからダウンロードします。これらは自動的に~/Downloads
に入ります。理想的には、これらのファイルを次のコマンドで開くことができるようにしたいだけです。
evince "the most recently modified file"
ファイル名を見つけるために~/Downloads
を開く必要はありません。
bash
で「最近変更されたファイル」を指定する簡単な方法はありますか?
注:これを行うのは可能であることはわかっていますが、理想的には、名前を確認するためにls -t
'ing ~/Downloads
よりも簡単な解決策を探しています。
evince "$(ls -t | head -n1)"
スペース、タブ、および(私が信じる)印刷スペシャルを処理しますが、ファイル名に改行が含まれている場合、および場合によっては他の非印刷文字で壊れます。
これは、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
のみを検索しますが、ディレクトリをサポートするように一般化することは難しくありません。その場合、名前の変更も保証されます。
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)"
いいえ。たとえあったとしても、一部のシステムログが通常は最新の更新ファイルではないことを確認できませんでした。
ケビンの答え(彼は私をそれに打ち負かした)は、あなたが避けたいだけならうまくいきます手動で開く~/Downloads
。