use*_*419 6 shell scripting bash rename
我对 bash 还很陌生;我几乎可以一次使用简单的命令 1 执行简单的管理任务。但是,我的任务是使用文本文件作为重命名源来重命名目录中的一些文件,并且非常感谢一些指针,因为我已经超出了我的深度。
让我解释:
New File Name.xlsx 0.1 000011F4.dat
New File Name.xlsx 0.2 000011F5.dat
New File Name.xlsx 0.3 000011F6.dat
New File Name.xlsx 0.4 000011F7.dat
New File Name.xlsx 0.5 000011F8.dat
New File Name.xlsx 0.6 000011F9.dat
Run Code Online (Sandbox Code Playgroud)
我的源文本文件有点类似于上面的。目的是第一个“列”是文件的新名称,中间是版本,第三个是当前文件名。
我需要重命名目录中的 .dat 文件,将它们更改为第一列中显示的名称。我还需要在每个文件的开头添加版本号 0.1、0.2 等。
我有几个问题:
文件中有空格是一个大问题吗?在每个文件字符串周围添加“”会更好吗?
基本上我不知道从哪里开始,任何帮助将不胜感激。正如您所看到的,它比通常的重命名稍微复杂一些,因此需要将版本列添加到文件名的开头和列表中的空格。
小智 7
这应该有效:
sh <(sed -r 's/^\s*(.*)\s+([0-9\.]+)\s+([0-9A-Z]{8}\.dat)\s*$/mv -iv \3 "\2 \1"/' files)
Run Code Online (Sandbox Code Playgroud)
...files
您的源文件的名称在哪里。
这样做是使用进程替换将sed
命令的结果传递给sh
(shell)的新实例。命令的输出是:sed
mv -iv 000011F4.dat "0.1 New File Name.xlsx"
mv -iv 000011F5.dat "0.2 New File Name.xlsx"
mv -iv 000011F6.dat "0.3 New File Name.xlsx"
mv -iv 000011F7.dat "0.4 New File Name.xlsx"
mv -iv 000011F8.dat "0.5 New File Name.xlsx"
mv -iv 000011F9.dat "0.6 New File Name.xlsx"
Run Code Online (Sandbox Code Playgroud)
将sed
命令分开,它会搜索一个模式:
^
- 行的开头\s*
- 开头的任何空格(.*)
- 任何字符(括号将结果存储到\1
)\s+
- 至少一个空格字符([0-9\.]+)
- 至少之一0-9
和.
(存储到\2
)\s+
- 至少一个空格字符([0-9A-Z]{8}\.dat)
-0-9
或 中的8 个字符A-Z
,后跟.dat
(存储到\3
)\s*
- 末尾的任何空格$
- 行尾...并取代它mv -iv \3 "\2 \1"
,其中\1
以\3
是先前存储的值。如果您愿意,您可以在版本号和文件名的其余部分之间使用空格以外的其他内容。
结果如下:
$ ls -l
total 60
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F4.dat
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F5.dat
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F6.dat
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F7.dat
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F8.dat
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F9.dat
-rw-rw-r-- 1 z z 222 Aug 8 13:47 files
$ sh <(sed -r 's/^\s*(.*)\s+([0-9\.]+)\s+([0-9A-Z]{8}\.dat)\s*$/mv -iv \3 "\2 \1"/' files)
`000011F4.dat' -> `0.1 New File Name.xlsx'
`000011F5.dat' -> `0.2 New File Name.xlsx'
`000011F6.dat' -> `0.3 New File Name.xlsx'
`000011F7.dat' -> `0.4 New File Name.xlsx'
`000011F8.dat' -> `0.5 New File Name.xlsx'
`000011F9.dat' -> `0.6 New File Name.xlsx'
$ ls -l
total 60
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.1 New File Name.xlsx
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.2 New File Name.xlsx
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.3 New File Name.xlsx
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.4 New File Name.xlsx
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.5 New File Name.xlsx
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.6 New File Name.xlsx
-rw-rw-r-- 1 z z 222 Aug 8 13:47 files
Run Code Online (Sandbox Code Playgroud)