将文件重命名为CRC32和扩展名

时间:2019-03-21 01:03:29

标签: regex bash sed

我正在尝试根据其CRC32值重命名文件夹中的所有文件。

我基于这篇帖子的工作:Rename files to md5 sum + extension (BASH)

md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/e'

我对sed知之甚少,并尝试教给我自己足够的正则表达式以对发生的事情进行逆向工程,但似乎无法理解。 我正在使用bash和crc32函数来实现此目的。

我会很乐意帮助您,如果有人有时间分解并帮助我理解,我会更加感激。

2 个答案:

答案 0 :(得分:3)

以下是逐步说明:

$ ls -1
abc.txt
def.txt
ghi.txt

$ crc32 *
c7e06c1a        abc.txt
042999b4        def.txt
e686c130        ghi.txt

$ crc32 * | sed -e "s/^\(\S*\)\s*\(.*\(\..*\)\)$/mv -v \2 \1\3/g"
mv -v abc.txt c7e06c1a.txt
mv -v def.txt 042999b4.txt
mv -v ghi.txt e686c130.txt

详细情况:

s/                  # substitute the following expression
^                   # begin of line
\(\S*\)             # store every char until whitespace  (\1)
\s*                 # whitespace
\(.*                # store every char...                (\2)
\(\..*\)            # until '.', store it extra          (\3)
\)                  # end brace of \2
$                   # end of line
/mv -v \2 \1\3      # command with stored arguments
/g                  # global, on the whole line

要一步执行,请将“ g”替换为“ e”

$ crc32 * | sed -e "s/^\(\S*\)\s*\(.*\(\..*\)\)$/mv -v \2 \1\3/e"
renamed 'abc.txt' -> 'c7e06c1a.txt'
renamed 'def.txt' -> '042999b4.txt'
renamed 'ghi.txt' -> 'e686c130.txt'

如果您不使用gnu sed,请删除“ e”并添加“ | sh”

crc32 * | sed -e "s/^\(\S*\)\s*\(.*\(\..*\)\)$/mv -v \2 \1\3/" | sh

答案 1 :(得分:0)

这可能对您有用(GNU并行):

crc32 * | parallel --plus -C '\t' mv -v {2} {1}.{2+.}