2009-11-16 69 views
3

之前,我有一个目录,看起来像这样:地带人物时期如果文件名有前缀中的Bash

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 

本页面现在是一个社区的wiki。您可以在下面添加更多的优雅的解决方案:

for folder in $(ls .) 
do 
    something better 
+0

你可能有/想'pushd'的地方在那里。 – 2009-11-16 11:54:59

+0

同样你也想精确地“$ {文件夹}”。前缀删除,或任何三个块(点分隔)文件名的第一部分? – 2009-11-16 11:56:10

+0

@Douglas哎呀,意外删除了pushd。我把它放回去了。是的,这是正确的。 – terrace 2009-11-16 12:00:27

回答

3

试试这个:

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

你真的应该使用find那么你就不会需要检查“-d文件夹”或临时文件和execs或while循环。

您可以通过使用过程substition避免临时文件:

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

感兴趣的另一个项目:您的系统可能已经有一个Perl脚本调用renameprename将使用正则表达式重命名文件。

+0

这样做的伎俩。我看下一次,我必须做这样的事情。不知道正则表达式是一个恼人的障碍。谢谢! – terrace 2009-11-16 12:04:59

0

使用以下正则表达式:

/\A(.\*?\\.){2,2}.+\Z/ 
+0

呃,会引发语法错误。我对正则表达式知之甚少,不知道如何解决它。 – terrace 2009-11-16 11:51:34

+0

用^和\ Z替换\ A,然后再试一次 – ennuikiller 2009-11-16 15:18:25

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 
+0

威尔会给出这个镜头。谢谢。 – terrace 2009-11-16 12:06:10

+0

啊,这个方法的问题是,有一些情况下,我有这个:Folder1/Folder1.txt。此方法重命名这些文件“txt”。 – terrace 2009-11-16 12:10:19

+1

你说你想删除“Folder1”。字首 :-)。 – 2009-11-16 12:15:39

相关问题