Linux
Linux 將單個未知文件重命名為 new_file.txt
我發現了許多將多個文件批量重命名為具有相同模式的新文件的範例。但是我只想將一個文件重命名為固定文件名。我經常收到一個新文件,其變數名稱部分基於日期,但名稱中包含其他隨機字元。然後我想更改文件的名稱,這樣我就可以做一些
sed
操作,然後導入到數據庫中。然後將刪除這兩個文件。
收到 想 20210809-random-numbers.txt
new_file.txt
我努力了:
mv *.txt new_file.txt
我認為這不會起作用,因為它是單個選項的多個選項。
假設您想在文件名的開頭找到一個格式為今天日期
YYYYMMDD
的文件,並且與模式匹配YYYYMMDD-*.txt
,並將其重命名為new_file.txt
,則此bash
腳本將執行此操作:#!/bin/bash # Make non-matching globbing patterns disappear. shopt -s nullglob # Get today's date. printf -v today '%(%Y%m%d)T' -1 # Get names in the current directory matching our pattern. set -- "$today"-*.txt # Sanity check. if [ "$#" -ne 1 ]; then printf 'There are %d names matching "%s-*.txt", expected 1\n' \ "$#" "$today" >&2 exit 1 fi # Inform user of action and proceed. printf 'Renaming "%s" into "new_file.txt"\n' "$1" mv -f "$1" new_file.txt
這匹配目前目錄中的名稱,如果任何單個文件與我們預期的格式匹配,則將其重命名為
new_file.txt
. 如果多個或零個文件與我們的模式匹配,那麼我們會通知使用者並終止。匹配的文件名保存在使用內置命令設置的位置參數列表中,即
$1
、$2
、$3
等。set
這個列表的長度由 shell 在特殊變數中維護$#
,我們期望單個文件名匹配。測試:
$ ls script $ ./script There are 0 names matching "20210808-*.txt", expected 1
$ touch 20210808-blahblah-{1..5}.txt $ ls 20210808-blahblah-1.txt 20210808-blahblah-4.txt 20210808-blahblah-2.txt 20210808-blahblah-5.txt 20210808-blahblah-3.txt script $ ./script There are 5 names matching "20210808-*.txt", expected 1
$ rm 20210808-blahblah-[2-5].txt $ ls 20210808-blahblah-1.txt script $ ./script Renaming "20210808-blahblah-1.txt" into "new_file.txt" $ ls new_file.txt script