我經常從瀏覽器下載帶有令人髮指的數位檔案名稱的 PDF 檔案。這些會自動進入~/Downloads
.理想情況下,我希望能夠使用以下命令開啟這些文件:
evince "the most recently modified file"
無需打開即可~/Downloads
查找檔案名稱。
有沒有一種簡單的方法來指定「最近修改的檔案」bash
?
注意:我知道這是可能的來做到這一點,但理想情況下我正在尋找一種比ls -t
'ing~/Downloads
檢查名稱更簡單的解決方案。
答案1
evince "$(ls -t | head -n1)"
雖然它可以處理空格、製表符和(我相信)打印特殊字符,但如果文件名包含換行符,並且可能包含其他一些非打印字符,它就會中斷。
答案2
這是一種比 更正確、更穩健的方法ls -t
,但代價是增加了一些額外的複雜性。
設定
將一個簡短的 shell 腳本(程式碼如下)加入您的$PATH
. ~/bin
是一個好地方。
記得確認一下
- 該腳本是可執行的
chmod +x ~/bin/script_name
~/bin
在你的$PATH
用法
將要在最新文件上運行的命令傳遞~/Download
到last_download
.
例子
假設您為腳本命名last_download
last_download
(無參數):evince
在最新文件上執行預設命令~/Downloads
last_download mplayer
mplayer
:在最新的文件上運行~/Downloads
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
但將其概括為支援任何目錄並不困難,在這種情況下,也需要更改名稱。
答案3
exec zsh
evince ~/Downloads/*.pdf(om[1])
或者如果您不想切換到 zsh
cd ~/Downloads
zsh -c 'evince ./*.pdf(om[1])'
括號之間的位元是全域限定符。om
更改 glob 的順序以使用修改時間而不是名稱(最新的在前)。[1]
意味著僅使用第一個匹配項。
有關更多信息,請參閱這是「如何在 zsh 中過濾 glob」的答案。
答案4
不,即使有,您也無法確定某些系統日誌通常不是最近更新的檔案。
如果你只是想避免,凱文的回答(他先於我)有效手動開幕~/Downloads
。