如何一次更改一堆文件名?

时间:2014-04-23 07:05:14

标签: shell cygwin

我有几个xml个文件,我想批量重命名。我无法使用rename命令。

E.g。

CN_GG121509_176321-29956-2014-04-16-05-07-20.xml
CN_GG121509_176321-29956-2014-04-16-05-08-22.xml

应重命名为

CN_GG121509_176321-29956-2014-04-16-05-07-20_reprocess1.xml
CN_GG121509_176321-29956-2014-04-16-05-08-22_reprocess2.xml

-----------------
CN_GG121509_176321-29956-2014-04-16-05-08-22_reprocess11112.xml
CN_GG121509_176321-29956-2014-04-16-05-08-22_reprocess11113.xml
应该动态更新来自reprocess(N)N

我尝试了下面的命令

find -type f -name "*.xml" -exec sh -c 'mv $1 "${1_reprocess%.xml}.xml"' {} \;

但这没效果。

修改

使用以下命令

for FILE in *.xml; do mv "$FILE" $(echo "$FILE" | sed 's/\.xml/_reprocess\.xml/'); done

4 个答案:

答案 0 :(得分:1)

试试这个:

find -type f -name "*.xml" | while read file; do  mv "$file" "${file%.xml}_reprocess.xml"; done

在文件名末尾添加一个计数器:

find -type f -name "*.xml" | { i=0; while read file; do 
  mv "$file" "${file%.xml}_reprocess${i}.xml";
  let $[i++];
done; }

(你可以把它写成一行)

答案 1 :(得分:1)

find -type f -name "*.xml" -exec sh -c 'mv "$0" "${0%.xml}_reprocess.xml"' {} \;
您的示例中的

${1_reprocess%.xml}.xml会从变量.xml中删除尾随字符串${1_reprocess}(并附加.xml),这就是它无效的原因。

编辑:

#!/bin/bash    
i=1
for file in *.xml; do
    [ -f "${file}" ] || continue
    mv "${file}" "${file%.xml}_reprocess${i}.xml"
    ((i++))
done

答案 2 :(得分:1)

您可以使用此查找:

find . -type f -name "*.xml" -exec bash -c 'f="${1%.xml}"; echo mv "$1" "${f}_reprocess.xml"' - '{}' \;

编辑:根据评论:

i=0
while read -r f; do
   (i++))
   mv "$f" "${f%.xml}_reprocess${i}.xml"
done < <(find . -type f -name "*.xml")

答案 3 :(得分:0)

一种选择是使用xargs

find . -type f -name "*.xml" | sed 's/.xml//' |  xargs -I % mv % %_reprocess.xml