Bash 批量重命名文件夹删除尾随字符
我有很多以“u”和6位数字结尾的目录,例如: 我想在当前文件夹中找到所有这些文件夹,并通过删除“u”和结尾的6位数字来重命名它们 到目前为止,我一直坚持这个命令:Bash 批量重命名文件夹删除尾随字符,bash,directory,rename,Bash,Directory,Rename,我有很多以“u”和6位数字结尾的目录,例如: 我想在当前文件夹中找到所有这些文件夹,并通过删除“u”和结尾的6位数字来重命名它们 到目前为止,我一直坚持这个命令: find . -type d -print |grep '.*[0-9]\{6\}$' |xargs -I {} bash -c 'for i in {}; do mv "$i" ????; done;' 我找不到最后一步该怎么做。我会试着打电话给塞德,但怎么打? 还有,如果有更好的方法,请告诉我 谢谢给你: find /path
find . -type d -print |grep '.*[0-9]\{6\}$' |xargs -I {} bash -c 'for i in {}; do mv "$i" ????; done;'
我找不到最后一步该怎么做。我会试着打电话给塞德,但怎么打?
还有,如果有更好的方法,请告诉我
谢谢给你:
find /path -regex '.*_[0-9]\{6\}' -exec sh -c 'n="{}"; echo mv "{}" "${n%_*}"' \;
检查输出,如果看起来不错,则将echo
放在那里
说明:对于每个匹配的文件,我们运行一个子shell,在其中我们将文件名分配给变量n
,这样我们就可以使用模式替换${n%\u*}
,它将截断最后一个\
字符及其后的所有内容,直到文件名结束
或者,这里有一种更便携的方法也适用于较旧的系统:
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
替换为我们在\(…\)
中捕获的部分以下是使用shell的一种方法:
for i in $(find . -mindepth 1 -type d -regextype posix-extended -regex '.*_[0-9]{6}'); do
mv "$i" "${i%_*}";
done
#/usr/bin/env bash
集合x
ls-d diff*>dirlist
而IFS=''读取字段1字段2字段3字段4字段5字段6
做
mv-v“${field1}{field2}{field3}{field4}{field5}{field6}”\
“${field1}{field2}{field3}{field4}{field5}”
已完成的列表
这似乎有效,谢谢。你能解释一下“${i%\*}”吗?@Napseis:当然。这是bash参数替换,它从变量中删除最短的尾部模式(.*
)。第页的汇总表可能值得一看。干杯。第一个在我的壳上不起作用,但是第二个起作用。这也适用于我们的发现-regextype posix extended-regex'.*.[0-9]{6}sed-ne的/(.*)[0-9]{6\}$/mv“&“\1”/p”但我不明白那部分,你能解释一下吗?:mv“&”“\1”/pI为第一个解决方案中的sed
部分和${n%\u*}
添加了解释。
for i in $(find . -mindepth 1 -type d -regextype posix-extended -regex '.*_[0-9]{6}'); do
mv "$i" "${i%_*}";
done
#!/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