Linux

Linux 將單個未知文件重命名為 new_file.txt

  • August 15, 2021

我發現了許多將多個文件批量重命名為具有相同模式的新文件的範例。但是我只想將一個文件重命名為固定文件名。我經常收到一個新文件,其變數名稱部分基於日期,但名稱中包含其他隨機字元。然後我想更改文件的名稱,這樣我就可以做一些sed操作,然後導入到數據庫中。然後將刪除這兩個文件。

收到
20210809-random-numbers.txtnew_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

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