2017-12-21 21 views
0

私は約7,000の.txtファイルを持っています。このファイルは、命名規則が明確に破られたプログラムによって吐き出されています。唯一の恩恵は、id、date、timeという構造に従うことです。ファイル名に書式を追加し、バッチ名を変更するにはどうすればいいですか?

m031060209104704.txt - > ID:m031日付:060209時間:104704他のファイル名のサンプル(再び同じこと)

.TXT:

115-060202105710.txt - > ID:115-日付:060202時間:105710 .txtの

x138051203125338.txt等...

9756060201194530.txtなど。

私は次のように見えるように、このディレクトリ内のすべての7000のファイルの名前を変更したい:

m031060209104704.txt - >090206_104704_m031

.txtの

すなわちdate_time_id(それぞれがアンダースコアやハイフンで区切られた、私は気にしないでください)。 上記のようにyymmddからddmmyyに切り替えるには、日付形式が必要です!

私は明確ではないですいただきました!やり過ぎここで、完全なプログラムのスクリプトまたはbashコマンド(MAC OS)。再び、私は気にしない、すべての助けを感謝します。

+1

どういうところですか? – Roadowl

+1

何か試しましたか? – Inian

+0

あなたは何を試みましたか?類似のファイルの名前を変更する例は、Stackoverflow.comにたくさんあります。 –

答えて

3

ような何か試してみてください:

#!/bin/bash 

# directory to store renamed files 
newdir="./renamed" 
mkdir -p $newdir 

for file in *.txt; do 
    if [[ $file =~ ^(....)([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{6})\.txt$ ]]; then 
     # extract parameters 
     id=${BASH_REMATCH[1]} 
     yy=${BASH_REMATCH[2]} 
     mm=${BASH_REMATCH[3]} 
     dd=${BASH_REMATCH[4]} 
     time=${BASH_REMATCH[5]} 

     # then rearrange them to new name 
     newname=${dd}${mm}${yy}_${time}_${id}.txt 

     # move to new directory 
     mv "$file" "$newdir/$newname" 
    fi 
done 
+0

私が必要としていたことを完全に行いました。また、 'sed'や正規表現のものよりもはるかに分かりやすく、数時間前に試していました!ありがとうございます – Abbie

3

Bashの文字列のインデックスを使用すると、意図したとおりのファイル名を手直しすることは非常に簡単かつ効率的になります。また、入力ファイル名が20文字でしか動作していないことを検証する必要があります。上

#!/bin/bash 

for i in *.txt; do 
    ## validate a 20 character filename 
    ((${#i} == 20)) || { printf "invalid length '%s'\n" "$i"; continue; } 
    echo "mv $i ${i:8:2}${i:6:2}${i:4:2}_${i:10:6}_${i:0:4}.txt" ## output rename 
    mv "$i" "${i:8:2}${i:6:2}${i:4:2}_${i:10:6}_${i:0:4}.txt" ## actual rename 
done 

例ディレクトリ

$ ls -l 
total 0 
-rw-r--r-- 1 david david 0 Dec 21 19:16 115-060202105710.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:16 9756060201194530.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:15 m031060209104704.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:16 x138051203125338.txt 

使用例/出力

$ cd thedir 
$ bash ../script.sh 
mv 115-060202105710.txt 020206_105710_115-.txt 
mv 9756060201194530.txt 010206_194530_9756.txt 
mv m031060209104704.txt 090206_104704_m031.txt 
mv x138051203125338.txt 031205_125338_x138.txt 

$ ls -l 
total 0 
-rw-r--r-- 1 david david 0 Dec 21 19:42 010206_194530_9756.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:42 020206_105710_115-.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:42 031205_125338_x138.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:42 090206_104704_m031.txt 

ルック事を、あなたはそれ以上を持っているなら、私に知らせて:それは次のように達成することができます質問。

+1

ああ...ちょっと、ホールド ':)' –

関連する問題