使用路径名重命名文件

时间:2016-11-26 18:05:23

标签: bash rename

我有一些类型为.csv的文件,但它们的名称不同。理想情况下,我希望脚本能够找到所有.csv类型的文件,并使用其路径名重命名文件。

重命名文件时,它们应该是这样的:

/home/doc/funds2015/folder xxx/folder 123/Folder xxx/something1.csv
/home/doc/funds2015/folder xxx/folder 123/Folder xxx/something2.csv    
xxx_123_01_01.csv 
xxx_123_02_01.csv 

有人可以帮助我重构这段代码,在一个干净的循环中执行此操作。我是bash的新手。

oldpath= "/home/doc/funds2015"

for file in $(find $oldpath -type f -name something1.csv); do
    shortname=${file#$oldpath/}
    newname="${shortname "some reg ex"}"

    if [ -f $newname ]; then
            echo "$newname already exists."
    else
            echo "copy: $file"
            echo "  --> $newname"
            cp $file $newname
    fi
done

for file in $(find $oldpath -type f -name something2.csv); do
    shortname=${file#$oldpath/}
    newname="$oldpath "some reg ex"}"

    if [ -f $newname ]; then
        echo "$newname already exists."
    else
        echo "copy: $file"
        echo "  --> $newname"
        cp $file $newname
    fi
done

2 个答案:

答案 0 :(得分:0)

您不需要任何循环。

您可以使用命令重命名,检索并重用任何带有perl表达式的表达式。

以下是此类表达的一些示例:

rename -n "s/^.*([0-9]{3}).*$/Clannad_c\$1/" *
rename -n "s/^(.*)c([0-9]{3})\/(.*)$/\$1c\$2\/Clannad_c\$2p\$3/" */*
rename -n "s/(.*)\/(.*)/\$1\/\$1p\$2/" */*
rename -n "s/^.*([0-9]{4}).*$/Hajime\ no\ Ippo_c\$1/" *
rename -n "s/(c[0-9]{3}_p[0-9]{2}.jpg)$/v38_\$1/" Vagabond_v38*/*

您可以将路径或文件名的任何部分与()匹配,并将其重复使用$ 1,$ 2,......并且使用shell扩展,您甚至不需要进行循环( / )。

如果我要坚持你所尝试的更接近的东西,我会使用命令find和它的选项-exec。

以下是一个例子:

find "$sourceDir*v0$volumeNumber*" -type f -name "*.(jpg|png)" -exec zip --quiet -r $newVolume {} +

此命令可找到一些jpg和png文件并将其压缩。

答案 1 :(得分:0)

只是一个想法(没有for循环的东西)。每个文件夹中只有一个文件吗? 您可以查看 basename dirname 命令。也许还有 tr 。 像:

dirname /home/doc/folder12/folder34/file.csv | tr "/" "_"

为您提供路径(没有文件名部分)

basename /home/doc/folder12/folder34/file.csv

仅提供文件名,没有路径

所以,

path_reformatted=$(dirname /home/doc/folder12/folder34/file.csv | tr "/" "_")

filename=$(basename /home/doc/folder12/folder34/file.csv | tr "/" "_")

new_filename=$path_reformatted$filename
mv $old_filename $new_filename

会返回一个可用的文件名吗?