我正在尝试根据其CRC32值重命名文件夹中的所有文件。
我基于这篇帖子的工作:Rename files to md5 sum + extension (BASH)
md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/e'
我对sed知之甚少,并尝试教给我自己足够的正则表达式以对发生的事情进行逆向工程,但似乎无法理解。 我正在使用bash和crc32函数来实现此目的。
我会很乐意帮助您,如果有人有时间分解并帮助我理解,我会更加感激。
答案 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+.}