批量重命名文件夹删除尾随字符

时间:2013-11-24 11:07:38

标签: bash directory rename

我有很多以" _和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,但是怎么样? 此外,如果有更好的方式,请告诉。

由于

3 个答案:

答案 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

说明:

  1. sed命令接收要重命名的文件列表
  2. 在模式中,我们捕获\( ... \)
  3. 中文件名的第一部分
  4. 我们将文字替换为文字mv "&" "\1",其中&替换为匹配的模式,在本例中为整个原始文件名,\1替换为部分我们在\( ... \)
  5. 内捕获

答案 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