Bash

製作從 lsmv 的管道

  • June 25, 2020

我正在嘗試在命令行上為自己製作一個小實用程序 - 對於給定的目前工作目錄,我想找到最近添加的文件並將mv其命名為參數給出的名稱

我一直試圖通過以下方式實現這一目標: ls -tr | tail -n 1 | xargs -0 -J % mv % SQL_warning_2.png

…但是 bash 報告:

mv: rename Screenshot 2020-06-22 at 17.53.23.png
to SQL_warning_2.png: No such file or directory

我猜這意味著 xargs 正在通過文件名中的空格創建單獨的參數: ,但我知道Screenshot 2020-06-22 at 17.53.23.png沒有-print0標誌。ls

如果我的一些假設不正確,請原諒 - 我對 xargs 非常不熟悉

由於您似乎假設您的文件名不包含換行符(您使用 選擇一個tail),您可以只使用

ls -tr | tail -n 1 | xargs -I % mv -- % SQL_warning_2.png

-I %將導致讀取一行xargs呼叫一次實用程序,並替換為該行的文本。相反,在空格上分割行:%``-J %

$ echo 1 2 3 | xargs -J {} printf '"%s"\n' {}
"1"
"2"
"3"
$ echo 1 2 3 | xargs -I {} printf '"%s"\n' {}
"1 2 3"

您似乎想重命名目前目錄中最近修改的文件。這可以使用zshshell 來完成,如下所示:

mv -- *(.om[1]) SQL_warning_2.png

這將mv使用最近修改的正常文件名作為第一個參數進行呼叫。它是om[1]在 glob 限定符中按 mtime 時間戳(從最新到最舊)對名稱列表進行排序並挑選出第一個。前面的點僅選擇正常文件(而不是目錄等)

來自bash

zsh -c 'mv -- *(.om[1]) SQL_warning_2.png'

引用自:https://unix.stackexchange.com/questions/594390