2016-11-26 233 views
1
的文件

我有一些类型为.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 
+0

您的文件路径中有两个“xxx”位,并且您的示例输出中有一个“xxx”位。你想要哪个“xxx”? – spinkus

+0

我只想要第一个'xxx'并将'_01'附加到所有.csv文件的末尾 –

回答

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文件,并拉上他们。

0

只是一个想法(没有for循环的东西)。每个文件夹中只有一个文件? 您可以查看基本名称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 

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