用空格重命名文件

我想要一个脚本,在Linux上工作,从这种forms重命名文件,即雅虎巴贝尔鱼 – 持久性跨站点脚本Vulnerability.jpgforms雅虎巴贝尔鱼持久跨站点脚本漏洞

它只删除每个空格,并用连字符改变它,如果它是两个空格之间的连字符,它只会删除空格,就像你在这个部分看到的“鱼 – 持久”到“鱼持久”

鉴于你想处理当前目录中的每个文件,你可以做两行:

for f in *; do mv "$f" "$(echo $f | sed 's/ /-/g')"; done for f in *; do mv "$f" "$(echo $f | sed 's/---/-/g')"; done 

可能有一种方法可以在一条线上完成,但目前我无法想到。

这里是一个纯粹的bash解决方案,它利用了bash的数组和extglob特性:

 shopt -s extglob oIFS="$IFS" # save the original IFS for file in *.jpg; do # Or whatever pattern you like target=( ${file//+(-)/ } ) # Break the filename into an array on spaces, after turning - into space. IFS='-' # Temporarily set the internal field separator into a dash so we can join on dashes. mv "$file" "${target[*]}" IFS="$oIFS" done 
 for file in *.jpg ; do file2="${file// - /-}"; file2="${file2// /-}"; echo mv "$file" "$file2" ;done 

删除回声,如果这是你想要的。

下面是我写这个时候存在的三个答案的一些基准。 随意扩展:

 $ ./rename_bench setting up timing ext real 0m35.453s user 0m6.006s sys 0m27.417s setting up timing sed real 1m17.498s user 0m15.223s sys 0m56.376s setting up timing straight real 0m38.352s user 0m6.028s sys 0m28.254s $ ./rename_bench setting up timing ext real 0m36.234s user 0m6.030s sys 0m28.270s setting up timing sed real 1m16.467s user 0m15.277s sys 0m56.194s setting up timing straight real 0m33.538s user 0m5.911s sys 0m26.672s 

实际的基准脚本:

 #!/bin/bash setup() { cd $(mktemp -dt "foo") && touch 'a - '{0..10000}'buzz.jpg' } ext_rename() { shopt -s extglob oIFS="$IFS" # save the original IFS for file in *.jpg; do # Or whatever pattern you like target=( ${file//+(-)/ } ) # Break the filename into an array on spaces, after turning - into space. IFS='-' # Temporarily set the internal field separator into a dash so we can join on dashes. mv "$file" "${target[*]}" IFS="$oIFS" done } sed_rename() { for f in *.jpg; do mv "$f" "$(sed -e 's/ /-/g' -e 's/---/-/g' <<< "$f")" done } straight_rename() { for file in *.jpg; do file2="${file// - /-}" file2="${file2// /-}" mv "$file" "$file2" done } echo "setting up" setup echo "timing ext" time ext_rename echo "setting up" setup echo "timing sed" time sed_rename echo "setting up" setup echo "timing straight" time straight_rename