2016-11-26 14 views
1

ファイルタイプが.csvですが、ファイル名が異なります。理想的には、スクリプトで.csvタイプのすべてのファイルを検索し、パス名を使用してファイルの名前を変更したいと思います。誰かが私は1つのきれいなループでこれを行うには、このコードを再構築助けることができるパス名を使用してファイルの名前を変更します。

/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

ファイルパスには2つの "xxx"ビットがあり、出力例には "xxx"が1つあります。どの「xxx」が欲しいですか? – spinkus

+0

私は最初の 'xxx'だけを必要とし、すべての.csvファイルの最後に '_01'を追加します –

答えて

0

ループは必要ありません。

コマンドrenameを使用して、任意の式を取得して再利用することができます。ここで

は、このような表現のいくつかの例です:

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、でそれを再利用...そしてシェルの使用とすることができますループを行う必要はありません(/)。

私があなたが試したものに近いものに固執するなら、findとそのオプション-execを使用します。ここで

は一例です:

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

このコマンドは、いくつかのJPGやPNGファイルを検索し、それらをzip形式。

0

単なる考えです(forループのものはありません)。各フォルダには1つのファイルしかありませんか? ベース名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 

、パスので

せず、唯一のあなたのファイル名を与えます使用可能なファイル名を返しますか?

関連する問題