如果文件名有前缀,则在点号之前删除字符(Bash中)

3

我有一个目录,看起来像这样:

pages/
    folder1/
        folder1.filename1.txt
        folder1.filename2.txt
    folder2/
        folder2.filename4.txt
        folder2.filename5.txt
    folder3/
        filename6.txt

我希望它看起来像这样:

pages/
    folder1/
        filename1.txt
        filename2.txt
    folder2/
        filename3.txt
        filename4.txt
    folder3/
        filename5.txt

使用ls * | sed -e s/^[^.]*.// > /tmp/filenames.txt命令,我得到了一个包含以下内容的文件:

filename1.txt
filename2.txt
filename3.txt
filename4.txt
txt

我该如何告诉sed忽略形式为[filename].[suffix]的文件名,只查看形如[foldername].[filename].[suffix]的文件名?最终脚本(正如指出的那样,find命令会简化事情,但这也有效):
for folder in $(ls .)
do
    if test -d $folder
    then
        pushd $folder
                ls * | sed 's/.*\.\(.*\..*\)/\1/' > /tmp/filenames.txt
                ls * > /tmp/current.txt

                exec 3</tmp/current.txt
                exec 4</tmp/filenames.txt

                while read file <&3; read name <&4;
                do
                    mv "$file" "$name"
                done

                rm /tmp/current.txt
                rm /tmp/filenames.txt
        popd
    else
        echo $folder "not a directory"
    fi
done

exit 0

本页面现已成为社区维基。您可以在下方添加更加优雅的解决方案:

for folder in $(ls .)
do 
     something better

你可能在那里有/想要一个 pushd - Douglas Leeder
你是想要精确地删除"${folder}."前缀,还是删除任何三节块(以点分隔)文件名的第一部分? - Douglas Leeder
@Douglas 哎呀,不小心把pushd删掉了。我重新加上了。是的,完全正确。 - terrace
3个回答

3

试一试这个:

sed 's/.*\.\(.*\..*\)/\1/'

如果您使用find命令,就不需要检查“-d文件夹”或临时文件和执行文件或while循环。

您可以通过使用进程替换来避免临时文件:

while read line
do
    echo $line
done < <(ls)

还有一件值得关注的事情:你的系统可能已经有一个名为renameprename的Perl脚本,它可以使用正则表达式重命名文件。


那有效了。下一次我需要做类似的事情,我会研究使用查找功能。不懂正则表达式是很烦人的阻碍。谢谢! - terrace

2

您不需要使用sed

ls * > /tmp/current.txt
exec 3</tmp/current.txt
while read file <&3;
do
    replacement=${file#${folder}.}
    if [ "$replacement" != "txt" ] ; then
        mv "$file" "$replacement"
    fi
done

我会试一试。谢谢。 - terrace
啊,这种方法的问题在于有些情况下我会遇到这样的文件路径:Folder1/Folder1.txt。这种方法会将这些文件重命名为“txt”。 - terrace
1
你说过你想要移除“Folder1.”前缀 :-). - Douglas Leeder

0
请使用以下正则表达式:
/\A(.\*?\\.){2,2}.+\Z/

嗯,抛出了语法错误。我对正则表达式的了解不足,不知道该如何修复它。 - terrace
将 \A 替换为 ^,将 \Z 替换为 $,然后再试一次。 - ennuikiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接