我有几个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
答案 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