Bash製作從
製作從 ls
到 mv
的管道
我正在嘗試在命令行上為自己製作一個小實用程序 - 對於給定的目前工作目錄,我想找到最近添加的文件並將
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"
您似乎想重命名目前目錄中最近修改的文件。這可以使用
zsh
shell 來完成,如下所示:mv -- *(.om[1]) SQL_warning_2.png
這將
mv
使用最近修改的正常文件名作為第一個參數進行呼叫。它是om[1]
在 glob 限定符中按 mtime 時間戳(從最新到最舊)對名稱列表進行排序並挑選出第一個。前面的點僅選擇正常文件(而不是目錄等)來自
bash
:zsh -c 'mv -- *(.om[1]) SQL_warning_2.png'