我发现了许多将多个文件批量重命名为具有相同模式的新文件的示例。但是我只想将一个文件重命名为固定文件名。我经常收到一个新文件,其变量名称部分基于日期,但名称中包含其他随机字符。然后我想更改文件的名称,以便我可以执行一些sed
操作,然后导入到数据库中。然后这两个文件都将被删除。
收到 | 想 |
---|---|
20210809-random-numbers.txt |
new_file.txt |
我努力了:
mv *.txt new_file.txt
我认为这不会起作用,因为它是单个选项的多个选项。
答案1
假设你想找到一个文件今天的日期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
答案2
使用date
( man date
) (+format
和--date=
选项)、find
( man find
) 和一些小心的 shell 引用 ( man bash
) 并执行类似的操作(未经测试,但使用 进行检查shellcheck.org
):
#!/bin/bash
# Yesterday's file
tgt="$(date "+%Y%m%d" --date="yesterday")"
# Today's file
tgt="$(date "+%Y%m%d" )"
# find the file - check to ensure we find only 1 file
file="$(find $PWD -maxdepth 1 -type f -name "${tgt}\*.txt" -print)"
if [[ $(echo "$file" | wc -l) -ne 1 ]] then
echo "Too many files $file"
exit 1
fi
echo mv "$file" new_file.txt
# or just process `"$file"` with `sed`.
exit 0
答案3
尝试 :
find /your-path-here -name "`date +%Y%m%d`-*.txt" -exec mv {} your-path-here/new_file.txt \;
tested on cygwin:
pt@ptphoto7 ~
$ ls -l ./test ; find ./test -name "`date +%Y%m%d`-*.txt" -exec mv {} test/new-file.txt \;
total 3
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 20210810-stuff-and-things.txt
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 20210812-stuff-and-things.txt
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 20210815-stuff-and-things.txt
pt@ptphoto7 ~
$ ls -l ./test
total 3
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 20210810-stuff-and-things.txt
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 20210812-stuff-and-things.txt
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 new-file.txt
pt@ptphoto7 ~
注意:如果新文件嵌入多个目录深处,则效果不佳;从你的问题中尚不清楚是否属于这种情况。