我有很多以" _和6位"结尾的目录,例如:
diff_gb_and_pf_2voids_158543
我想找到当前文件夹中的所有文件夹,并通过删除" _"重命名它们。和最后的6位数。
到目前为止,我仍然坚持这个命令:
find . -type d -print |grep '.*[0-9]\{6\}$' |xargs -I {} bash -c 'for i in {}; do mv "$i" ????; done;'
我无法找到如何完成最后一步。我会试着打电话给sed,但是怎么样? 此外,如果有更好的方式,请告诉。
由于
答案 0 :(得分:1)
你走了:
find /path -regex '.*_[0-9]\{6\}' -exec sh -c 'n="{}"; echo mv "{}" "${n%_*}"' \;
检查输出,如果看起来不错,则将echo
放在那里。
说明:对于每个匹配的文件,我们运行一个子shell,我们将文件名分配给变量n
,这样我们就可以使用模式替换${n%_*}
,它会切断最后一个_
1}}字符及其后的所有内容,直到文件名结尾。
或者这是一种更便携的方式,也适用于旧系统:
find /path -name '*_[0-9][0-9][0-9][0-9][0-9][0-9]' | sed -ne 's/\(.*\)_[0-9]\{6\}$/mv "&" "\1"/p'
检查输出,如果它看起来好,而不是将其输送到sh
(附加:| sh
)
说明:
sed
命令接收要重命名的文件列表\( ... \)
mv "&" "\1"
,其中&
替换为匹配的模式,在本例中为整个原始文件名,\1
替换为部分我们在\( ... \)
答案 1 :(得分:1)
以下是使用shell的一种方法:
for i in $(find . -mindepth 1 -type d -regextype posix-extended -regex '.*_[0-9]{6}'); do
mv "$i" "${i%_*}";
done
答案 2 :(得分:0)
#!/usr/bin/env bash
set -x
ls -d diff* > dirlist
while IFS='_' read field1 field2 field3 field4 field5 field6
do
mv -v "${field1}_${field2}_${field3}_${field4}_${field5}_${field6}" \
"${field1}_${field2}_${field3}_${field4}_${field5}"
done < dirlist