Bash 使用路径名重命名文件

Bash 使用路径名重命名文件,bash,rename,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_0

我有一些.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

你不需要任何循环

您可以使用命令重命名、检索和重用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文件并对它们进行压缩。

您不需要任何循环

您可以使用命令重命名、检索和重用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文件并压缩它们。

只是一个想法(没有for循环)。每个文件夹中是否只有一个文件? 您可以签出basename和dirname命令。也许再加上tr。 比如:

提供路径(不带文件名部分)

只提供文件名,不提供路径

所以

这将返回一个可用的文件名?

只是一个想法(没有for循环的东西)。每个文件夹中是否只有一个文件? 您可以签出basename和dirname命令。也许再加上tr。 比如:

提供路径(不带文件名部分)

只提供文件名,不提供路径

所以


这将返回一个可用的文件名?

您的文件路径中有两个“xxx”位,您的示例输出中有一个“xxx”。您想要哪个“xxx”?我只想要第一个“xxx”,并将“\u 01”附加到所有.csv文件的末尾。您的文件路径中有两个“xxx”位,您的示例输出中有一个“xxx”。您想要哪个“xxx”?我只想要第一个“xxx”,并将“\u 01”附加到所有.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