【问题标题】:Rename files with path name用路径名重命名文件
【发布时间】:2017-04-10 19:48:16
【问题描述】:

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

【问题讨论】:

  • 您的文件路径中有两个“xxx”位,而您的示例输出中有一个“xxx”。你想要哪个“xxx”?
  • 我只想要第一个 'xxx' 并将 '_01' 附加到所有 .csv 文件的末尾

标签: bash rename


【解决方案1】:

只是一个想法(没有 for 循环的东西)。每个文件夹中只有一个文件吗? 您可以查看 basenamedirname 命令。也许除了 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

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

【讨论】:

    【解决方案2】:

    你不需要任何循环。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2015-03-04
      相关资源
      最近更新 更多